apsimo 1.4.4__tar.gz → 1.4.6__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.4.4 → apsimo-1.4.6}/PKG-INFO +2 -2
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/host.py +7 -7
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/schemas/host.py +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/beliefs/source_projection.py +2 -2
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/channels/phone_gateways.py +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/cli.py +2 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/importer.py +0 -29
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/store.py +1 -34
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/graph/client.py +3 -3
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/graph/queries.py +10 -0
- apsimo-1.4.6/apsimo/memory/__init__.py +1 -0
- {apsimo-1.4.4/apsimo/intelligence/graph → apsimo-1.4.6/apsimo/memory}/recall.py +1 -7
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/qualification/memory_cases.py +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/server.py +15 -28
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/setup.py +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/setup_hermes.py +15 -1
- apsimo-1.4.6/apsimo/setup_skills.py +90 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/idempotency.py +5 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/source_annotations.py +5 -3
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/source_attribution.py +3 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/source_read.py +43 -4
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/tool_observations.py +59 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo.egg-info/PKG-INFO +2 -2
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo.egg-info/SOURCES.txt +4 -3
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo.egg-info/requires.txt +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/pyproject.toml +2 -2
- apsimo-1.4.6/tests/test_canonical_source_read.py +249 -0
- apsimo-1.4.6/tests/test_contacts_persistence.py +120 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_current_work_recall_selection.py +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_media_read_reference_presentation.py +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_native_setup.py +98 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_procedure_source_context.py +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_recall_hybrid.py +3 -2
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_recall_request_repetition.py +2 -2
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_recall_source_presentation.py +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_recall_unified_context.py +44 -2
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_short_source_context.py +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_annotations.py +5 -5
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_audio_claims.py +3 -3
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_claim_projection.py +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_event_precision.py +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_excerpt_lineage.py +1 -1
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_vectors.py +5 -5
- apsimo-1.4.4/apsimo/contacts/world_bridge.py +0 -314
- apsimo-1.4.4/tests/test_canonical_source_read.py +0 -123
- apsimo-1.4.4/tests/test_contacts_persistence.py +0 -48
- {apsimo-1.4.4 → apsimo-1.4.6}/LICENSE +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/README.md +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/__main__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/agent/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/agent/client.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/agent/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/agents/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/agents/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/agents/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/agents/websocket.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/auth_telemetry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/authority.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/contact_grants.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/middleware.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/commitment_work.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/context_gate.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/executions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/followup_plans.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/governed_actions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/initiative_work.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/mining.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/observations.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/social_state.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/task_queue.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/temporal_followups.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/transport.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/routers/transport_ingress_api.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/api/schemas/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/autonomy/cli.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/autonomy/condition_worker.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/autonomy/config.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/autonomy/loop.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/autonomy/registry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/autonomy/scheduler.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/autonomy/synthesis.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/backup.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/beliefs/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/beliefs/contradictions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/beliefs/decay.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/beliefs/engine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/beliefs/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/beliefs/promotion.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/beliefs/resolve.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/beliefs/source_claims.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/beliefs/source_time.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/beliefs/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/briefings/aggregators.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/briefings/composer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/briefings/config.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/briefings/delivery.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/briefings/engagement.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/briefings/engine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/briefings/enhancer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/briefings/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/briefings/scheduler.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/briefings/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/block.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/cli.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/genesis.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/identity.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/keys.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/local_keys.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/manager.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/node.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/plugin_transactions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/protocol.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/state_machine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/storage.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/transactions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/chain/validation.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/channels/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/channels/manifest.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/channels/migrations/001_channels_schema.sql +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/channels/presence.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/channels/router.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/channels/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/cognition/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/cognition/charter.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/cognition/drive_governance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/cognition/evidence_pipeline.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/cognition/external_events.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/cognition/goal_spine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/cognition/introspection.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/cognition/prompt.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/cognition/runtime.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/cognition/trigger.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/commitments/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/commitments/local_work.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/commitments/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/commitments/work.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/compression/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/connectors/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/connectors/base.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/connectors/caldav_calendar.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/connectors/fs_documents.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/connectors/imap_email.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/connectors/manager.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/connectors/webhook_pull.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/comms.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/config.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/exporters/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/exporters/vcard.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/identity_links.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/importers/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/importers/batch.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/importers/macos_contacts.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/migrations/001_contacts_schema.sql +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/migrations/002_trust_scopes.sql +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/migrations/003_open_gateway_enum.sql +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/migrations/004_contact_provision_operations.sql +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/migrations/005_identity_links.sql +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/scoring.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contacts/transport_ingress.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contextgate/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contextgate/chunker.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contextgate/estimate.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contextgate/gate.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/contextgate/retrieve.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/delivery/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/delivery/bridge.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/delivery/channels.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/delivery/classification.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/delivery/rate_limiter.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/delivery/reachout_policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/directed/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/directed/audit.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/directed/intake.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/directed/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/directed/service.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/directives/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/directives/evidence.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/directives/extractor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/directives/guard.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/directives/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/directives/service.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/directives/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/doctor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/environment.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/events/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/events/broadcaster.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/events/bus.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/events/journal.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/events/stream.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/events/types.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/execution_results.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/feedback/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/feedback/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/feeds/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/feeds/cli.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/feeds/engine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/feeds/example-feed.yaml +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/feeds/hermes_cron.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/feeds/manager.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/feeds/spec.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/feeds/template.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/audit.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/communication_policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/config.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/context_provenance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/env_risk.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/guard_audit.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/layers/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/layers/base.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/layers/l1_recipient.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/layers/l2_pii.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/layers/l3_cross_context.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/layers/l4_trust_tier.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/layers/l5_injection.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/layers/l6_review.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/layers/l7_delay.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/layers/tom2_epistemic.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/pending_dispatch.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/pipeline.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/rejection.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/response_guard.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/rulesets/injection_v1.yaml +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/surface_policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/gate/taint.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/genesis.json +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/goals/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/goals/config.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/goals/decomposer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/goals/engine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/goals/inference.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/goals/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/goals/priority.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/goals/queue_bridge.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/goals/replan.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/goals/schema.sql +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/goals/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/governed_actions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/harness_integration/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/harness_integration/context.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/harness_integration/skills.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity/participants.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity/resolver.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/builder.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/corpus.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/runner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/seeders/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/seeders/briefings.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/seeders/chain.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/seeders/goals.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/seeders/memory.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/seeders/neo4j_cognition.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/seeders/relationship.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/seeders/sessions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/seeders/skills.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/seeders/task_queue.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/seeders/world_model.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/self_query.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/self_reflection.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/skill.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/identity_bootstrap/verifier.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/initiatives/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/initiatives/action_registry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/initiatives/approval_authority.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/initiatives/approval_policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/initiatives/assignment.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/initiatives/backup_evidence.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/initiatives/context_freshness.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/initiatives/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/initiatives/native_work.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/initiatives/standing_approvals.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/initiatives/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/initiatives/temporal_followup.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/cognition/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/cognition/gap_detector.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/cognition/metalearner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/cognition/metrics_collector.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/cognition/performance_index.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/cognition/registry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/cognition/strategy_adjuster.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/cognition/types.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/components/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/components/anomaly_detector.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/components/initiative_engine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/components/preference_learner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/components/research_orchestrator.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/components/self_directed_thinker.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/components/self_reflector.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/components/session_continuity.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/components/task_planner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/components/tool_learner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/graph/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/graph/consolidator.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/graph/distiller.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/graph/migrations.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/graph/reconciler.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/graph/schema.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/learning/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/learning/continuous_learner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/learning/feedback_store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/mind_model/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/mind_model/graph_baseline.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/mind_model/signal_collector.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/relationships/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/relationships/profiler.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/relationships/scorer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/relationships/signal_floor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/relationships/trust_tiers.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/synthesis/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/synthesis/connection_discoverer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/synthesis/cross_domain_analyzer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/synthesis/insight_deliverer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/synthesis/insight_store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/synthesis/insight_validator.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/synthesis/novelty_scorer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/turn_middleware/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/intelligence/turn_middleware/memory_sync.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/mcp/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/mcp/__main__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/mcp/config.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/mcp/server.py +0 -0
- {apsimo-1.4.4/apsimo/intelligence/graph → apsimo-1.4.6/apsimo/memory}/selection.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/migrations.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/mining/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/mining/corpus.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/mining/escalations.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/mining/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/mining/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/models/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/models/memory.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/models/mesh.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/models/person.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/models/signal.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/observations/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/observations/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/patterns/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/patterns/extract.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/patterns/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/persona/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/persona/engine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/persona/manifest.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/projects/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/projects/engine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/projects/event_outbox.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/projects/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/projects/planner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/projects/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/proposals/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/proposals/engine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/proposals/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/qualification/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/qualification/cases.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/qualification/cli.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/qualification/records.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/qualification/report.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/qualification/runner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/qualification/structured_cases.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/reasoning/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/reasoning/executor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/reasoning/loop.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/reasoning/native_tools/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/reasoning/native_tools/calculate.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/reasoning/native_tools/file_ops.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/reasoning/native_tools/web_search.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/reasoning/tool_policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/redact/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/repos/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/repos/mirrors.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/artifact.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/gatherer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/pipeline.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/search/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/search/base.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/search/brave.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/search/cache.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/search/duckduckgo.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/search/orchestrator.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/search/serpapi.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/search/tavily.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/research/synthesizer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/router/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/router/complexity_scorer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/router/endpoints.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/router/fallback.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/router/functions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/router/native_policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/router/router.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/router/self_learning.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/router/tiers.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/sandbox/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/sandbox/backend.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/sandbox/manager.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/scope_bounds.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/secrets/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/secrets/backends/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/secrets/backends/base.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/secrets/backends/env.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/secrets/backends/keyring.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/secrets/backends/onepassword.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/secrets/cli.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/secrets/manager.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/secrets/migration.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/secrets/types.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/appraisals.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/benchmark.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/brief.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/event_concerns.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/execution_forecasts.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/expectations.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/experiments.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/journal.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/judgments.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/native_outcomes.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/params.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/perspective.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/reconcile.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/reply_forecasts.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/runtime_forecasts.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/runtime_models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/settlement.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/situation.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/supervised.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/thinker.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/trust.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/self_model/workspace.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/services/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/services/agent_bridge.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/services/initiative_executor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/services/instance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/sessions/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/sessions/config.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/sessions/context_loader.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/sessions/federation_session.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/sessions/isolated_session.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/sessions/reports.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/sessions/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/setup_local_work.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/setup_native_goals.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/setup_native_reviews.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/base.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/budget.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/executor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/executors/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/executors/behavioral_correction.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/executors/capability_gap.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/executors/data_quality.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/executors/knowledge_acquisition.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/executors/operational_hygiene.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/executors/subsystem_health.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/hermes_export.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/index.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/learning/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/learning/novelty_detector.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/learning/pattern_extractor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/learning/triggers.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/loader.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/migrations/002_progressive_loading.sql +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/migrations/backfill_triggers.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/packager.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/protocols.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/registry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/runtime.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/sandbox_runner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/scheduler.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/schema.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/security/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/security/guards.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills/security/scanner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills_memory/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills_memory/distill.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills_memory/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills_memory/retrieve.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/skills_memory/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/surprise/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/surprise/accumulation.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/surprise/scorer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/surprise/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/action_receipts.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/approval_relay_canary.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/config.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/contract.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/events.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/governor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/handlers/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/handlers/base.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/handlers/inference.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/handlers/monitoring.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/handlers/registry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/handlers/subtask_handler.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/handlers/system_maintenance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/mesh_integration.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/models.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/queue_manager.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/routing.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/scheduler.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/schema.sql +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/work_control.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/task_queue/worker.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/telemetry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/affect.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/approvals.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/arcs.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/asymmetry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/eligibility.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/engagement.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/exposure.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/extractor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/fact_adapters.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/facts.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/integration.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/leveled.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/levels.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/recipient_audit.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/recipient_simulator.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/source_lineage.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/tom2.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/visibility.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tom/visibility_store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tools/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tools/definitions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/tools/handlers.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/toolsmith/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/toolsmith/authority.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/toolsmith/engine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/toolsmith/integrity.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/toolsmith/miner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/toolsmith/policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/toolsmith/registry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/audio.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/documents.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/executions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/hermes_history.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/hermes_kanban.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/hermes_work.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/history_references.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/local_work.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/media.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/reported_workers.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/source_vectors.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/turns/video.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/util/autonomy_preset.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/util/instance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/util/model_output.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/util/quiet_hours.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/util/session_safety.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/util/temporal.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/backfill.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/caption.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/collections.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/config.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/embedder.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/image_preprocess.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/image_store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/indexes.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/migrate.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/multimodal_provider.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/multimodal_types.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/openai_provider.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/query.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/reranker.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/safety_image.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/scanner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/setup.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/vector/tiers.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/work_orders.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/workers/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/workers/agent_bridge.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/workers/colony_worker.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/workers/queue_worker.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/workers/skills_sync.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/causal_maintenance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/causal_policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/causal_query.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/confidence.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/config.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/constants.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/entities.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/expectation_resolvers.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/base.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/conversation_extractor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/detector.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/document_extractor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/formats/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/formats/csv_fmt.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/formats/html_fmt.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/formats/json_fmt.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/formats/pdf.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/formats/text.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/llm_extractor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/extraction/pipeline.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/integrations/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/integrations/mind_model_bridge.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/integrations/social_intel_bridge.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/jobs/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/jobs/extraction_job.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/llm_extract.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/observations.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/populator.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/relationships.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/resolution/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/resolution/entity_resolver.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/resolution/merge_audit.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/resolution/merge_workflow.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/source_reports.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/sqlite/__init__.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/sqlite/backend.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/sqlite/schema.sql +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo/world_model/store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo.egg-info/dependency_links.txt +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo.egg-info/entry_points.txt +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/apsimo.egg-info/top_level.txt +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/setup.cfg +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_accepted_local_work.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_adaptive_params.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_affect.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_agent_action_routing.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_agent_api.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_agent_bridge.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_agent_bridge_service.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_agent_sdk.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_agent_sensor_loop.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_agent_snapshot.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_agent_store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_annotated_recall_reinforcement.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_answer_source_lineage.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_appraisal_incident_decisions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_approval_gate.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_approval_relay_canary.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_apsimo_compat.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_apsimo_harness_guidance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_assignment_engine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_audit_cleanup.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_auth_coverage.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_auth_migration_readiness.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_authz_scope_api.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_autonomy_preset.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_backup.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_backup_receipt_evidence.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_beliefs.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_bind_auth_guard.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_boundary_fail_closed.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_bounded_approval_authority.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_briefing_aggregators.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_canonical_scoped_context.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_causal_extract.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_causal_falsifiability.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_causal_maintenance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_causal_policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_causal_query.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_causal_query_only_guard.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_chain_keys.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_channel_preferences.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_channel_registry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_channel_store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_cognition.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_cognition_evidence_pipeline.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_cognition_evidence_server_wiring.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_cognition_goal_spine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_cognition_observability.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_cognition_p4_controlled_learning.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_cognition_p4_server_integration.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_cognition_p6_p7_server_wiring.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_cognition_p7_drive_governance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_cognition_phase_b_runtime.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_cognition_phase_c_scheduler.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_cognition_server_wiring.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_colony_memory_provider.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_commitment_resolution.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_commitment_resolution_downgrade.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_commitment_resolution_schema.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_commitment_work.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_commitments.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_comms_source_erasure.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_competence_reconciliation.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_compression.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_concern_resolution_receipts.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_condition_producer.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_connectors.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_contact_fact_recall.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_contact_policy_projection.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_contact_provisioning.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_contact_timezone.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_contacts_intro.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_context_gate.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_context_phase1.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_context_provenance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_context_skill_ownership.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_conversation_presence.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_conversation_turn_concerns.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_delivery_bridge_503.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_delivery_gateway_identity.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_delivery_reachout_routing.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_directed.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_directed_envelope.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_directed_reports.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_directed_trust.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_directive_sources.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_directives.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_distill.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_doctor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_document_memory_guard.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_duckduckgo_provider.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_embedding_generations.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_enrolled_sender_turns.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_ensure_channel_id.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_env_risk.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_event_broadcasts.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_event_bus_types.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_event_concerns.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_event_stream_reliability.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_execution_forecasts.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_execution_input_purpose.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_execution_registry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_expectations.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_expectations_v2.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_experiments.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_external_cognition_events.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_external_event_concerns.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_facts_backfill.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_feedback.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_followup_plans.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_forecast_learning.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_function_routing.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_gap_generators.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_genesis_manifest.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_global_pause.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_goal_dispatch_availability.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_goal_inference_provenance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_goal_reader_imports.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_governed_actions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_governed_research_handoff.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_graduated_approvals.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_grant_envelope.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_graph_reindex_metadata.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_guard_audit.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_guard_chat_mode.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_guard_derive_context.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_guard_enforce_policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_export.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_general_governance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_history_import.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_native_tool_authority.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_plugin_contract.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_plugin_event_lifecycle.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_plugin_event_replay.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_plugin_guard_shadow.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_plugin_signals.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_plugin_turn_id.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_queue_stats_projection.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_setup.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_turn_outbox.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hermes_work_projection.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_host_input_provenance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_hostworker_agreement.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_identity_continuity.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_identity_corrections.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_inference_context_gate.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_initiative_engine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_initiative_evidence.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_initiative_executor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_initiative_feedback.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_initiative_pipeline_v016.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_initiative_retry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_initiative_store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_input_source_lineage.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_insight_store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_instance_service.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_instance_service_live.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_intelligence_components.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_intelligence_synthesis.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_introduction_initiatives.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_job_writeback.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_journal.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_legacy_fact_context.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_local_work_context.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_loop_stats_accuracy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_mcp_config.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_mcp_server.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_memory_decay.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_memory_formation.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_memory_governance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_memory_promotion.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_memory_prune.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_memory_read_hydration.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_memory_response_schemas.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_migrations.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_mining.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_model_qualification_cli.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_model_qualification_memory.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_model_qualification_runner.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_model_qualification_structured.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_native_accepted_local_work.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_native_history_references.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_native_initiative_work.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_native_input_carrier.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_native_outcome_judgments.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_native_request_erasure.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_native_review_recurrence.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_native_source_image_read.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_native_source_read.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_native_source_video_read.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_native_tool_observations.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_operator_deck_read_truth.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_ordinary_context_briefings.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_owner_preferences.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_p2_wirings.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_partial_work_rendering.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_patterns.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_pending_work_coverage.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_persona.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_persona_setup_result.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_phase_capability_check.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_preset_loop_coupling.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_project_event_outbox.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_project_result_reconciliation_phase.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_projects.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_prompt_evals.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_proposals.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_provenance_population.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_pseudo_agi_production_chain.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_queue_completed_filter.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_queue_contract.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_quiet_hours_and_reload.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_reachout_policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_recall_person_boost.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_recall_ranking.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_recall_rerank.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_recency.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_reflection_task_routing.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_rejection_loop.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_relationship_calendar_aggregators.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_relationship_score_refresh.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_relationship_signal_floor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_relationships.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_reply_forecast_callback_order.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_reply_forecast_stops.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_reply_forecasts.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_repo_tools.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_reported_worker_status.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_request_capabilities.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_request_work_context.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_reranker_remote.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_research_orchestrator.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_resolve_messaging_handle.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_response_guard.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_response_guard_communication_policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_response_guard_endpoint.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_response_guard_surface_policy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_router_tiers.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_runtime_model_observations.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_sandbox.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_scoped_api_authority.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_scoped_contact_resolution.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_secondary_review_contract.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_selected_autonomy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_self_directed_thinker.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_self_initiatives.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_self_judgment_opt_in.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_self_judgment_premises.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_self_judgments.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_self_model.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_self_perspective.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_selfhood_benchmark.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_session_reports.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_shared_facts.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_shared_local_undertaking.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_sidecar.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_signals_attribution.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_situation_spine.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_skill_approval.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_skill_attribution.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_skill_sandbox.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_skill_synthesis.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_skill_synthesis_wiring.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_skills_memory.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_social_context_flow.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_social_transport.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_annotation_claim_survivors.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_appraisals.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_attribution.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_audio.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_claim_budget.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_claim_diagnostics.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_claim_media_eligibility.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_claim_review.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_claim_subject_basis.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_document_read.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_documents.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_episode_admission.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_episode_memory.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_episode_revisions.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_image_read.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_media.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_memory_backup.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_time_query.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_source_video.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_sqlite_connection_ownership.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_supervised_rung.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_surprise.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_sweep_fixes.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_synthesis.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_telemetry_staleness.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_temporal.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_temporal_followups.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_temporal_index.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_test_environment_isolation.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_thinking_phase.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_thought_function_routing.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tick_phase_budget.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tier_endpoints.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_timeline.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_approvals.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_asymmetry.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_context.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_cross_gate.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_eligibility.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_epistemic_guard.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_exposure.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_kill_switch.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_level_coherence.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_leveled.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_levels.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_source_corrections.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_taint.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom2_wiring.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom_event_lineage.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom_extractor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom_p8_arcs.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom_p8_boundary_corpus.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom_p8_fact_adapters.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom_p8_outbound_integration.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom_p8_recipient_audit.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom_p8_recipient_simulator.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom_p8_server_integration.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom_p8_visibility.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom_p8_visibility_store.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tom_source_lineage.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tool_handlers_graph.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tool_observation_reader.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tool_provenance.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_tool_surface.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_toolsmith.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_transport_ingress.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_transport_ingress_api.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_trust_configure.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_trust_scopes.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_trust_scopes_p2.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_turn_idempotency_ledger.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_turn_idempotency_v2.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_turn_ner_entities.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_turn_source_erasure.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_turn_source_evidence.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_turn_survivor_delivery.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_validation_sweep_fixes.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_vector_vacuum.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_wizard_autonomy.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_work_ancestry_projection.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_work_control_production_blockers.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_work_control_v1.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_work_orders.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_work_read_surface_authority.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_work_source_coverage.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_worker_handler_boundaries.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_worker_heartbeat_truth.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_worker_http_authority.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_worker_integration.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_worker_lifecycle_durability.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_workers_governor.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_workers_install.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_workspace.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_world_context_query.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_world_entity_reinforcement.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_world_llm_extract.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_world_model_prune.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_world_observations.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_world_populator.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_world_quality.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_world_store_api.py +0 -0
- {apsimo-1.4.4 → apsimo-1.4.6}/tests/test_world_supervised.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: apsimo
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.6
|
|
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.4.
|
|
31
|
+
Requires-Dist: apsimo-hermes<2,>=1.4.6; extra == "hermes"
|
|
32
32
|
Provides-Extra: mcp
|
|
33
33
|
Requires-Dist: mcp[cli]<2,>=1.0; extra == "mcp"
|
|
34
34
|
Provides-Extra: lancedb
|
|
@@ -2516,7 +2516,7 @@ async def context_assemble(
|
|
|
2516
2516
|
|
|
2517
2517
|
# --- Memory: authorized candidates, one selection and one budget ---
|
|
2518
2518
|
if _canonical_person_allowed and query_text:
|
|
2519
|
-
from apsimo.
|
|
2519
|
+
from apsimo.memory.recall import source_candidates
|
|
2520
2520
|
beliefs, quotations, source_hits, semantic_media = [], [], [], []
|
|
2521
2521
|
source_ledger = None
|
|
2522
2522
|
if not _canonical_only and _graph is not None:
|
|
@@ -2581,7 +2581,7 @@ async def context_assemble(
|
|
|
2581
2581
|
contact_tz, body.context.timezone or ("UTC" if _canonical_only else None)))
|
|
2582
2582
|
if source_ledger is not None:
|
|
2583
2583
|
from apsimo.beliefs.source_projection import SourceClaimProjection
|
|
2584
|
-
from apsimo.
|
|
2584
|
+
from apsimo.memory.selection import current_work_query
|
|
2585
2585
|
beliefs, quotations = SourceClaimProjection(source_ledger).prepare_context(
|
|
2586
2586
|
beliefs, source_hits, contact_id=body.context.contact_id,
|
|
2587
2587
|
session_id=body.context.session_id, time_query=time_query,
|
|
@@ -2598,7 +2598,7 @@ async def context_assemble(
|
|
|
2598
2598
|
# The projected view preserves envelope and current-source
|
|
2599
2599
|
# checks. A fact needs query overlap before any fail-open
|
|
2600
2600
|
# reranker path; confidence alone never makes it relevant.
|
|
2601
|
-
from apsimo.
|
|
2601
|
+
from apsimo.memory.recall import contact_fact_candidates
|
|
2602
2602
|
fact_result = _tom_context_facts.list_facts(
|
|
2603
2603
|
contact_id=body.context.contact_id, limit=512)
|
|
2604
2604
|
facts = fact_result if isinstance(fact_result, list) else fact_result.get('facts', [])
|
|
@@ -2623,7 +2623,7 @@ async def context_assemble(
|
|
|
2623
2623
|
from apsimo.turns.source_annotations import current_candidates
|
|
2624
2624
|
retained = current_candidates(source_ledger, selected, **annotation_scope)
|
|
2625
2625
|
if len(retained) != len(selected):
|
|
2626
|
-
from apsimo.
|
|
2626
|
+
from apsimo.memory.recall import pack_memory_context
|
|
2627
2627
|
selected, body_text = pack_memory_context(retained, limit=5,
|
|
2628
2628
|
max_chars=max(0, min(max_chars, 24000)))
|
|
2629
2629
|
if body_text:
|
|
@@ -11284,7 +11284,7 @@ async def enriched_context(
|
|
|
11284
11284
|
and (_p8_runtime is None or _enriched_p8_viewer is not None):
|
|
11285
11285
|
async def _shared_facts():
|
|
11286
11286
|
try:
|
|
11287
|
-
from apsimo.
|
|
11287
|
+
from apsimo.memory.recall import contact_fact_candidates, pack_memory_context
|
|
11288
11288
|
from apsimo.turns.source_annotations import expand, current_candidates
|
|
11289
11289
|
store = _p8_runtime.facts_store if _p8_runtime is not None else _facts_store
|
|
11290
11290
|
view = (_p8_runtime.projected_facts_view(_enriched_p8_viewer,
|
|
@@ -11725,8 +11725,8 @@ def _memory_context_selector():
|
|
|
11725
11725
|
"""Keep one selector per active reranker, also usable without graph storage."""
|
|
11726
11726
|
global _context_recall_selector
|
|
11727
11727
|
if _context_recall_selector is None or _context_recall_selector[0] is not _reranker:
|
|
11728
|
-
from apsimo.
|
|
11729
|
-
from apsimo.
|
|
11728
|
+
from apsimo.memory.selection import RecallSelector
|
|
11729
|
+
from apsimo.memory.recall import provider_calibration_metadata
|
|
11730
11730
|
provider = _reranker
|
|
11731
11731
|
selector = RecallSelector(
|
|
11732
11732
|
provider.rerank if provider is not None else None,
|
|
@@ -102,7 +102,7 @@ class MemoryReadRequest(BaseModel):
|
|
|
102
102
|
source_id: Optional[str] = Field(default=None, min_length=1, max_length=256)
|
|
103
103
|
source_version: Optional[str] = Field(default=None, pattern='^[0-9a-f]{64}$')
|
|
104
104
|
session_id: Optional[str] = Field(default=None, min_length=1, max_length=256)
|
|
105
|
-
source_view: Literal['source', 'assertions', 'image', 'document', 'video'] = 'source'
|
|
105
|
+
source_view: Literal['source', 'assertions', 'observations', 'image', 'document', 'video'] = 'source'
|
|
106
106
|
asset_hash: Optional[str] = Field(default=None, pattern='^[0-9a-f]{64}$')
|
|
107
107
|
page: Optional[int] = Field(default=None, ge=1, strict=True)
|
|
108
108
|
requested_ms: Optional[int] = Field(default=None, ge=0, le=30000, strict=True)
|
|
@@ -470,7 +470,7 @@ class SourceClaimProjection:
|
|
|
470
470
|
Unknown, corrected, changed, multiple-input and cross-scope provenance
|
|
471
471
|
remains recallable. This transient hint never changes stored history.
|
|
472
472
|
"""
|
|
473
|
-
from apsimo.
|
|
473
|
+
from apsimo.memory.selection import current_work_query
|
|
474
474
|
from apsimo.turns.idempotency import canonical_turn_digest, source_message_hash
|
|
475
475
|
if message.get('role') != 'assistant' or source['scope'] != 'person':
|
|
476
476
|
return False
|
|
@@ -521,7 +521,7 @@ class SourceClaimProjection:
|
|
|
521
521
|
"""
|
|
522
522
|
from apsimo.turns.idempotency import source_message_hash
|
|
523
523
|
from apsimo.turns.audio import source_text
|
|
524
|
-
from apsimo.
|
|
524
|
+
from apsimo.memory.recall import source_candidates
|
|
525
525
|
turn_ids = list(dict.fromkeys(
|
|
526
526
|
[row["turn_id"] for row in source_hits] + [str(row["source_uri"])[5:] for row in beliefs
|
|
527
527
|
if str(row.get("source_uri") or "").startswith("turn:")]))
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Shared phone gateway resolution.
|
|
2
2
|
|
|
3
3
|
Replaces the three hardcoded _PHONE_GATEWAYS tuples scattered across
|
|
4
|
-
contacts/store.py
|
|
4
|
+
contacts/store.py and identity/resolver.py.
|
|
5
5
|
|
|
6
6
|
Reads from the channel store when available; falls back to a built-in
|
|
7
7
|
set so the system works before any channels are registered.
|
|
@@ -43,6 +43,7 @@ def main() -> None:
|
|
|
43
43
|
init_p.add_argument("--quiet-hours", help="Optional local follow-up quiet window, HH:MM-HH:MM; grants no outreach permission")
|
|
44
44
|
init_p.add_argument("--whatsapp-read-receipts", choices=["on", "off"], help="Set this Hermes profile's read receipts for accepted WhatsApp messages; omission preserves its setting")
|
|
45
45
|
init_p.add_argument("--preferences-only", action="store_true", help="Update only an existing Hermes config preference; skip instance and model setup")
|
|
46
|
+
init_p.add_argument("--skills-only", action="store_true", help="Install or explicitly refresh owned bundled skills in one Hermes profile; no instance or model setup")
|
|
46
47
|
init_p.add_argument("--preview", action="store_true", help="With --preferences-only, show changed preference paths without writing")
|
|
47
48
|
init_p.add_argument("--model-url", help="One local OpenAI-compatible API root")
|
|
48
49
|
init_p.add_argument("--model", help="Model identifier at that endpoint")
|
|
@@ -313,7 +314,7 @@ def main() -> None:
|
|
|
313
314
|
code = run_init(root_dir=args.dir, args=args)
|
|
314
315
|
if code != 0:
|
|
315
316
|
sys.exit(code)
|
|
316
|
-
if args.preferences_only:
|
|
317
|
+
if args.preferences_only or args.skills_only:
|
|
317
318
|
return
|
|
318
319
|
|
|
319
320
|
# Initialize Apsimo identity if not already done
|
|
@@ -132,11 +132,9 @@ class SQLiteContactImporter(ContactImporter):
|
|
|
132
132
|
self,
|
|
133
133
|
store: SQLiteContactStore,
|
|
134
134
|
config: Optional[ContactsConfig] = None,
|
|
135
|
-
bridge = None, # Optional[WorldModelContactBridge]
|
|
136
135
|
) -> None:
|
|
137
136
|
self._store = store
|
|
138
137
|
self._config = config or ContactsConfig()
|
|
139
|
-
self._bridge = bridge
|
|
140
138
|
|
|
141
139
|
async def import_raw(self, records: List[RawContactRecord], source: str) -> BatchImportResult:
|
|
142
140
|
result = BatchImportResult(source=source, total=len(records))
|
|
@@ -186,9 +184,6 @@ class SQLiteContactImporter(ContactImporter):
|
|
|
186
184
|
contact_id=existing_id,
|
|
187
185
|
merged_into_id=existing_id,
|
|
188
186
|
))
|
|
189
|
-
# Absorb any discovered contacts with overlapping handles
|
|
190
|
-
if self._bridge:
|
|
191
|
-
await self._absorb_discovered_for(existing_id, norm_phones, norm_emails)
|
|
192
187
|
elif candidates and candidates[0][0] >= proposal_threshold:
|
|
193
188
|
# Below auto-merge but above proposal threshold — create and propose
|
|
194
189
|
contact = await self._store.create(
|
|
@@ -209,8 +204,6 @@ class SQLiteContactImporter(ContactImporter):
|
|
|
209
204
|
outcome=ImportOutcome.CREATED,
|
|
210
205
|
contact_id=contact.contact_id,
|
|
211
206
|
))
|
|
212
|
-
if self._bridge:
|
|
213
|
-
await self._absorb_discovered_for(contact.contact_id, norm_phones, norm_emails)
|
|
214
207
|
else:
|
|
215
208
|
# No match — create new contact
|
|
216
209
|
contact = await self._store.create(
|
|
@@ -230,8 +223,6 @@ class SQLiteContactImporter(ContactImporter):
|
|
|
230
223
|
outcome=ImportOutcome.CREATED,
|
|
231
224
|
contact_id=contact.contact_id,
|
|
232
225
|
))
|
|
233
|
-
if self._bridge:
|
|
234
|
-
await self._absorb_discovered_for(contact.contact_id, norm_phones, norm_emails)
|
|
235
226
|
except Exception as exc:
|
|
236
227
|
logger.warning(
|
|
237
228
|
"Failed to import record (name_hash=%s): %s",
|
|
@@ -245,26 +236,6 @@ class SQLiteContactImporter(ContactImporter):
|
|
|
245
236
|
))
|
|
246
237
|
return result
|
|
247
238
|
|
|
248
|
-
async def _absorb_discovered_for(
|
|
249
|
-
self,
|
|
250
|
-
curated_contact_id: str,
|
|
251
|
-
norm_phones: List[str],
|
|
252
|
-
norm_emails: List[str],
|
|
253
|
-
) -> None:
|
|
254
|
-
"""Find discovered contacts with overlapping handles and absorb them."""
|
|
255
|
-
if not self._bridge:
|
|
256
|
-
return
|
|
257
|
-
for phone in norm_phones:
|
|
258
|
-
discovered = await self._store.find_discovered_by_handle("imessage", phone)
|
|
259
|
-
if discovered:
|
|
260
|
-
await self._bridge.absorb_discovered_contact(curated_contact_id, discovered)
|
|
261
|
-
return
|
|
262
|
-
for email in norm_emails:
|
|
263
|
-
discovered = await self._store.find_discovered_by_handle("email", email)
|
|
264
|
-
if discovered:
|
|
265
|
-
await self._bridge.absorb_discovered_contact(curated_contact_id, discovered)
|
|
266
|
-
return
|
|
267
|
-
|
|
268
239
|
async def import_from_macos_contacts(self) -> BatchImportResult:
|
|
269
240
|
from .importers.macos_contacts import MacOSContactsImporter
|
|
270
241
|
importer = MacOSContactsImporter(normalize_phones=self._config.import_cfg.normalize_phones)
|
|
@@ -258,10 +258,9 @@ class ContactStore(ABC):
|
|
|
258
258
|
class SQLiteContactStore(ContactStore):
|
|
259
259
|
"""SQLite-backed implementation of ContactStore."""
|
|
260
260
|
|
|
261
|
-
def __init__(self, config: Optional[ContactsConfig] = None
|
|
261
|
+
def __init__(self, config: Optional[ContactsConfig] = None) -> None:
|
|
262
262
|
self._config = config or ContactsConfig()
|
|
263
263
|
self._db: Optional[aiosqlite.Connection] = None
|
|
264
|
-
self._graph = graph # Optional ColonyGraph for score sync
|
|
265
264
|
|
|
266
265
|
async def connect(self) -> None:
|
|
267
266
|
path = self._config.sqlite_path
|
|
@@ -529,28 +528,6 @@ class SQLiteContactStore(ContactStore):
|
|
|
529
528
|
return None
|
|
530
529
|
return Contact.from_row(dict(row))
|
|
531
530
|
|
|
532
|
-
async def find_discovered_by_handle(
|
|
533
|
-
self, gateway: str, address: str
|
|
534
|
-
) -> Optional[Contact]:
|
|
535
|
-
"""Find a discovered (world_model) contact that owns a given handle."""
|
|
536
|
-
db = self._require_db()
|
|
537
|
-
norm = _normalize_email(address) if gateway == "email" else _normalize_phone(address) if gateway in ("imessage", "sms", "signal") else address
|
|
538
|
-
async with db.execute(
|
|
539
|
-
"""
|
|
540
|
-
SELECT c.* FROM contacts c
|
|
541
|
-
JOIN contact_handles h ON h.contact_id = c.contact_id
|
|
542
|
-
WHERE c.import_source = 'world_model'
|
|
543
|
-
AND c.deleted_at IS NULL
|
|
544
|
-
AND h.gateway = ? AND h.address = ?
|
|
545
|
-
LIMIT 1
|
|
546
|
-
""",
|
|
547
|
-
(gateway, norm),
|
|
548
|
-
) as cur:
|
|
549
|
-
row = await cur.fetchone()
|
|
550
|
-
if row is None:
|
|
551
|
-
return None
|
|
552
|
-
return Contact.from_row(dict(row))
|
|
553
|
-
|
|
554
531
|
# ── Write ops ─────────────────────────────────────────────────────────────
|
|
555
532
|
|
|
556
533
|
async def create(
|
|
@@ -1121,16 +1098,6 @@ class SQLiteContactStore(ContactStore):
|
|
|
1121
1098
|
(score, _now_iso(), contact_id),
|
|
1122
1099
|
)
|
|
1123
1100
|
await db.commit()
|
|
1124
|
-
# Sync to graph if linked
|
|
1125
|
-
if self._graph is not None:
|
|
1126
|
-
try:
|
|
1127
|
-
contact = await self.get(contact_id)
|
|
1128
|
-
if contact and contact.person_node_id:
|
|
1129
|
-
await self._graph.update_person(
|
|
1130
|
-
contact.person_node_id, score=score,
|
|
1131
|
-
)
|
|
1132
|
-
except Exception as exc:
|
|
1133
|
-
logger.debug("Score sync to graph failed for %s: %s", contact_id, exc)
|
|
1134
1101
|
|
|
1135
1102
|
async def update_interaction_allowed(
|
|
1136
1103
|
self, contact_id: str, allowed: bool, performed_by: str = "operator"
|
|
@@ -1260,7 +1260,7 @@ class ColonyGraph:
|
|
|
1260
1260
|
memories.append(mem)
|
|
1261
1261
|
|
|
1262
1262
|
if hybrid:
|
|
1263
|
-
from .recall import fuse_candidates
|
|
1263
|
+
from apsimo.memory.recall import fuse_candidates
|
|
1264
1264
|
candidate_limit = min(max(limit * 5, limit), max(100, limit))
|
|
1265
1265
|
lexical = await self._recall_lexical(
|
|
1266
1266
|
query, candidate_limit, min_strength, min_confidence,
|
|
@@ -1394,7 +1394,7 @@ class ColonyGraph:
|
|
|
1394
1394
|
content reaches Python/reranking. A missing/populating index degrades
|
|
1395
1395
|
to the existing vector/keyword path.
|
|
1396
1396
|
"""
|
|
1397
|
-
from .
|
|
1397
|
+
from .queries import FULLTEXT_INDEX, lexical_query
|
|
1398
1398
|
search_text = lexical_query(query)
|
|
1399
1399
|
if not search_text:
|
|
1400
1400
|
return []
|
|
@@ -1468,7 +1468,7 @@ class ColonyGraph:
|
|
|
1468
1468
|
self, query, memories, limit, *, strength_ranking=False,
|
|
1469
1469
|
):
|
|
1470
1470
|
# The same selector is used for mixed source/belief turn context.
|
|
1471
|
-
from .selection import RecallSelector
|
|
1471
|
+
from apsimo.memory.selection import RecallSelector
|
|
1472
1472
|
selector = getattr(self, "_recall_selector", None)
|
|
1473
1473
|
if selector is None:
|
|
1474
1474
|
selector = self._recall_selector = RecallSelector(
|
|
@@ -7,6 +7,16 @@ and makes it easy to test / review / optimise in one place.
|
|
|
7
7
|
Parameters are referenced with ``$param`` syntax for Neo4j driver binding.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
+
FULLTEXT_INDEX = "memory_content_fulltext"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def lexical_query(text: str, max_terms: int = 16) -> str:
|
|
14
|
+
"""Literal words/identifiers, not caller-supplied Lucene operators."""
|
|
15
|
+
from apsimo.memory.recall import lexical_terms
|
|
16
|
+
|
|
17
|
+
return " OR ".join(f'"{word}"' for word in lexical_terms(text, max_terms))
|
|
18
|
+
|
|
19
|
+
|
|
10
20
|
# ──────────────────────────────────────────────────────────────────────
|
|
11
21
|
# Memory operations
|
|
12
22
|
# ──────────────────────────────────────────────────────────────────────
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Shared evidence selection and rendering for Apsimo memory."""
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Shared source candidates, rank fusion and bounded memory rendering."""
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
4
|
import re
|
|
@@ -7,7 +7,6 @@ import json
|
|
|
7
7
|
import os
|
|
8
8
|
from typing import Any
|
|
9
9
|
|
|
10
|
-
FULLTEXT_INDEX = "memory_content_fulltext"
|
|
11
10
|
_WORDS = re.compile(r"[^\W_]+(?:[-.][^\W_]+)*", re.UNICODE)
|
|
12
11
|
_STOP = frozenset("a an and are as at be by do does for from how i in is it me of on or that the this to was what when where which who with you".split())
|
|
13
12
|
|
|
@@ -209,11 +208,6 @@ def lexical_terms(text: str, max_terms: int = 16) -> list[str]:
|
|
|
209
208
|
return list(words)[:max_terms]
|
|
210
209
|
|
|
211
210
|
|
|
212
|
-
def lexical_query(text: str, max_terms: int = 16) -> str:
|
|
213
|
-
"""Literal words/identifiers, not caller-supplied Lucene operators."""
|
|
214
|
-
return " OR ".join(f'"{word}"' for word in lexical_terms(text, max_terms))
|
|
215
|
-
|
|
216
|
-
|
|
217
211
|
def contact_fact_candidates(query: str, facts: list[dict[str, Any]], *, limit: int = 25) -> list[dict[str, Any]]:
|
|
218
212
|
"""Lexical candidates from an authorized, current source-linked fact view.
|
|
219
213
|
|
|
@@ -13,7 +13,7 @@ from .records import CaseSpec
|
|
|
13
13
|
|
|
14
14
|
def _recollect(projection, query, *, contact, session, now, max_chars):
|
|
15
15
|
from apsimo.beliefs.source_time import interpret_time_query
|
|
16
|
-
from apsimo.
|
|
16
|
+
from apsimo.memory.recall import pack_memory_context
|
|
17
17
|
from apsimo.turns.source_annotations import expand, current_candidates
|
|
18
18
|
ledger = projection.ledger
|
|
19
19
|
hits = ledger.search_sources(query, contact_id=contact, session_id=session, limit=10)
|
|
@@ -1433,6 +1433,19 @@ def _scheduler_health_check(autonomy_loop) -> dict:
|
|
|
1433
1433
|
"autonomy_running": bool(getattr(autonomy_loop, "_running", False))}
|
|
1434
1434
|
|
|
1435
1435
|
|
|
1436
|
+
async def _initialize_contacts_store():
|
|
1437
|
+
"""Open the canonical contact store without graph backfill or pruning."""
|
|
1438
|
+
from apsimo.contacts.config import ContactsConfig
|
|
1439
|
+
from apsimo.contacts.store import SQLiteContactStore
|
|
1440
|
+
|
|
1441
|
+
config = ContactsConfig.from_env()
|
|
1442
|
+
store = SQLiteContactStore(config=config)
|
|
1443
|
+
await store.connect()
|
|
1444
|
+
set_contacts_store(store)
|
|
1445
|
+
logger.info("ContactsStore initialized (path=%s)", config.sqlite_path)
|
|
1446
|
+
return store
|
|
1447
|
+
|
|
1448
|
+
|
|
1436
1449
|
@asynccontextmanager
|
|
1437
1450
|
async def lifespan(app: FastAPI):
|
|
1438
1451
|
"""Initialize subsystems on startup, tear down on shutdown."""
|
|
@@ -1861,7 +1874,7 @@ async def lifespan(app: FastAPI):
|
|
|
1861
1874
|
# set_embed_fn wiring above). Registration alone changes
|
|
1862
1875
|
# nothing: use is gated by COLONY_RECALL_RERANK (default off).
|
|
1863
1876
|
if graph is not None and hasattr(graph, "set_rerank_fn"):
|
|
1864
|
-
from apsimo.
|
|
1877
|
+
from apsimo.memory.recall import provider_calibration_metadata
|
|
1865
1878
|
def recall_calibration_metadata():
|
|
1866
1879
|
return provider_calibration_metadata(reranker_provider)
|
|
1867
1880
|
graph.set_rerank_fn(
|
|
@@ -2526,36 +2539,10 @@ async def lifespan(app: FastAPI):
|
|
|
2526
2539
|
# --- 8. Contacts ---
|
|
2527
2540
|
contacts_store = None
|
|
2528
2541
|
try:
|
|
2529
|
-
|
|
2530
|
-
from apsimo.contacts.store import SQLiteContactStore
|
|
2531
|
-
contacts_config = ContactsConfig.from_env()
|
|
2532
|
-
contacts_store = SQLiteContactStore(config=contacts_config, graph=graph)
|
|
2533
|
-
await contacts_store.connect()
|
|
2534
|
-
set_contacts_store(contacts_store)
|
|
2535
|
-
logger.info("ContactsStore initialized (path=%s)", contacts_config.sqlite_path)
|
|
2542
|
+
contacts_store = await _initialize_contacts_store()
|
|
2536
2543
|
except Exception as exc:
|
|
2537
2544
|
logger.warning("ContactsStore init failed: %s", exc)
|
|
2538
2545
|
|
|
2539
|
-
# --- 8b. Contact-World Model Bridge ---
|
|
2540
|
-
if contacts_store is not None and graph is not None:
|
|
2541
|
-
try:
|
|
2542
|
-
from apsimo.contacts.world_bridge import WorldModelContactBridge
|
|
2543
|
-
bridge = WorldModelContactBridge(graph=graph, store=contacts_store)
|
|
2544
|
-
# Backfill all substantive Person nodes on startup
|
|
2545
|
-
backfill_stats = await bridge.backfill_all_people()
|
|
2546
|
-
logger.info(
|
|
2547
|
-
"WorldModelContactBridge initialized — backfill created=%d linked=%d skipped=%d",
|
|
2548
|
-
backfill_stats["created"], backfill_stats["linked"], backfill_stats["skipped"],
|
|
2549
|
-
)
|
|
2550
|
-
# Prune shadow contacts whose Person node no longer exists
|
|
2551
|
-
pruned = await bridge.prune_orphaned_shadows()
|
|
2552
|
-
if pruned:
|
|
2553
|
-
logger.info("Pruned %d orphaned shadow contacts", pruned)
|
|
2554
|
-
except Exception as exc:
|
|
2555
|
-
logger.warning("WorldModelContactBridge init failed: %s", exc)
|
|
2556
|
-
else:
|
|
2557
|
-
logger.info("WorldModelContactBridge skipped — contacts_store or graph unavailable")
|
|
2558
|
-
|
|
2559
2546
|
# --- 8d. Relationship profiler (standing + psyche + approach briefs) ---
|
|
2560
2547
|
if contacts_store is not None:
|
|
2561
2548
|
try:
|
|
@@ -1946,7 +1946,7 @@ def run_init(root_dir: str | None = None, args=None) -> int:
|
|
|
1946
1946
|
root_dir: Root directory for config files
|
|
1947
1947
|
args: Parsed argparse Namespace for non-interactive mode
|
|
1948
1948
|
"""
|
|
1949
|
-
if (getattr(args, 'owner_handle', None) or getattr(args, 'preferences_only', False) or getattr(args, 'preview', False)
|
|
1949
|
+
if (getattr(args, 'owner_handle', None) or getattr(args, 'preferences_only', False) or getattr(args, 'skills_only', False) or getattr(args, 'preview', False)
|
|
1950
1950
|
or getattr(args, 'whatsapp_read_receipts', None) is not None):
|
|
1951
1951
|
if (getattr(args, 'no_harness', False) or getattr(args, 'mcp_harnesses', None)
|
|
1952
1952
|
or getattr(args, 'host_framework', None) not in (None, 'hermes')):
|
|
@@ -569,14 +569,25 @@ def run(root_dir=None, args=None):
|
|
|
569
569
|
try:
|
|
570
570
|
receipt_choice = getattr(args, 'whatsapp_read_receipts', None)
|
|
571
571
|
preferences_only = bool(getattr(args, 'preferences_only', False))
|
|
572
|
+
skills_only = bool(getattr(args, 'skills_only', False))
|
|
572
573
|
preview = bool(getattr(args, 'preview', False))
|
|
573
|
-
if preferences_only:
|
|
574
|
+
if preferences_only or skills_only:
|
|
574
575
|
home = setup._resolve_hermes_home(getattr(args, 'hermes_home', None))
|
|
575
576
|
selected_python = None
|
|
576
577
|
else:
|
|
577
578
|
home, selected_python = _select_home(args, ask)
|
|
578
579
|
if preview and not preferences_only:
|
|
579
580
|
raise ValueError('--preview requires --preferences-only')
|
|
581
|
+
if skills_only:
|
|
582
|
+
if root_dir or receipt_choice or any(getattr(args, name, None) for name in (
|
|
583
|
+
'preferences_only', 'preview', 'start', 'refresh_adapter', 'replace_memory_provider',
|
|
584
|
+
'local_work', 'native_goals', 'native_reviews', 'model_url', 'model', 'agent_name',
|
|
585
|
+
'agent_values', 'timezone', 'quiet_hours', 'contact_name', 'owner_handle', 'encrypt',
|
|
586
|
+
'passphrase', 'claim_genesis', 'mcp_harnesses', 'no_harness')):
|
|
587
|
+
raise ValueError('--skills-only cannot be combined with instance or preference changes')
|
|
588
|
+
from .setup_skills import prepare, install
|
|
589
|
+
install(prepare(home, _adapter_resources(getattr(args, 'adapter_wheel', None)), refresh=True))
|
|
590
|
+
return 0
|
|
580
591
|
if preferences_only:
|
|
581
592
|
if receipt_choice is None:
|
|
582
593
|
raise ValueError('--preferences-only requires --whatsapp-read-receipts on or off')
|
|
@@ -673,6 +684,8 @@ def run(root_dir=None, args=None):
|
|
|
673
684
|
resources = _adapter_resources(getattr(args, 'adapter_wheel', None))
|
|
674
685
|
_preflight_outbox(home, resources)
|
|
675
686
|
binding = _adapter_binding(python, resources)
|
|
687
|
+
from .setup_skills import prepare as prepare_skills, install as install_skills
|
|
688
|
+
skill_updates = prepare_skills(home, resources)
|
|
676
689
|
owner_name = ask('Your name', getattr(args, 'contact_name', None) or os.environ.get('USER', 'Owner'), True)
|
|
677
690
|
owner_handles, owner_platforms = _owner_handles(args, ask, noninteractive)
|
|
678
691
|
agent_name = ask('Agent name', getattr(args, 'agent_name', None) or 'Assistant', True)
|
|
@@ -858,6 +871,7 @@ def run(root_dir=None, args=None):
|
|
|
858
871
|
guiding = ('Guiding values: ' + ', '.join(agent_preferences['values']) + '.\n'
|
|
859
872
|
if agent_preferences['values'] else '')
|
|
860
873
|
create(home/'SOUL.md', f'# {agent_name}\n\nYou are {agent_name}, the personal assistant of {owner_name}.\n{guiding}Use retained evidence with its provenance; ask about uncertainty.\nYour opinions are revisable interpretations; distinguish them from facts and permissions.\nOwner consent is required for consequential external actions; an existing task-scoped consent covers only its stated scope.\n')
|
|
874
|
+
install_skills(skill_updates)
|
|
861
875
|
except Exception:
|
|
862
876
|
# Undo only this installation's exact bytes. Concurrent edits stay
|
|
863
877
|
# intact, with original files still retained in the private state.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""Install owned bundled skills into one native Hermes catalog."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import hashlib
|
|
5
|
+
import json
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
import re
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
SKILL_NAME = 'apsimo-deep-research'
|
|
11
|
+
BUNDLE_PREFIX = 'apsimo_hermes/bundled_skills/'
|
|
12
|
+
SKILL_RESOURCE = f'{BUNDLE_PREFIX}{SKILL_NAME}/SKILL.md'
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _read_owned_path(path):
|
|
16
|
+
for parent in (path, *path.parents):
|
|
17
|
+
if parent.is_symlink():
|
|
18
|
+
raise ValueError('Bundled skill destination is symlinked; existing files were preserved')
|
|
19
|
+
return path.read_bytes() if path.exists() else None
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def prepare(home, resources, *, refresh=False):
|
|
23
|
+
"""Validate all packaged skill preimages before any setup writes/probe."""
|
|
24
|
+
updates = []
|
|
25
|
+
for path, content in sorted(resources.items()):
|
|
26
|
+
if not path.startswith(BUNDLE_PREFIX) or not path.endswith('/SKILL.md'):
|
|
27
|
+
continue
|
|
28
|
+
name = path[len(BUNDLE_PREFIX):-len('/SKILL.md')]
|
|
29
|
+
if not re.fullmatch(r'apsimo-[a-z0-9-]{1,56}', name):
|
|
30
|
+
raise ValueError('Bundled skill must have a canonical apsimo- name')
|
|
31
|
+
updates.extend(_prepare_skill(home, name, content, refresh=refresh))
|
|
32
|
+
if not updates:
|
|
33
|
+
raise ValueError('Selected adapter has no bundled skills')
|
|
34
|
+
return updates
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _prepare_skill(home, name, content, *, refresh):
|
|
38
|
+
if not content:
|
|
39
|
+
raise ValueError('Selected adapter has an empty bundled skill')
|
|
40
|
+
directory = Path(home)/'skills'/name
|
|
41
|
+
skill, marker = directory/'SKILL.md', directory/'.apsimo-owned.json'
|
|
42
|
+
previous, recorded = _read_owned_path(skill), _read_owned_path(marker)
|
|
43
|
+
digest = hashlib.sha256(content).hexdigest()
|
|
44
|
+
if recorded is None:
|
|
45
|
+
if directory.exists():
|
|
46
|
+
raise ValueError('Unowned bundled skill destination was preserved; choose another profile or move your copy')
|
|
47
|
+
else:
|
|
48
|
+
try:
|
|
49
|
+
record = json.loads(recorded)
|
|
50
|
+
owned = (record['owner'] == 'apsimo-hermes' and record['version'] == 1
|
|
51
|
+
and previous is not None
|
|
52
|
+
and record['sha256'] == hashlib.sha256(previous).hexdigest())
|
|
53
|
+
except (ValueError, KeyError, TypeError):
|
|
54
|
+
owned = False
|
|
55
|
+
if not owned:
|
|
56
|
+
raise ValueError('Locally modified bundled skill was preserved; keep your copy or reconcile it before refreshing')
|
|
57
|
+
if previous != content and not refresh:
|
|
58
|
+
raise ValueError('Bundled skill update requires explicit apsimo init --skills-only')
|
|
59
|
+
after = (json.dumps({'owner': 'apsimo-hermes', 'version': 1, 'sha256': digest},
|
|
60
|
+
sort_keys=True, indent=2)+'\n').encode()
|
|
61
|
+
return [(skill, previous, content), (marker, recorded, after)]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def install(updates):
|
|
65
|
+
"""Replace only previously verified owned bytes; retain local edits on conflict."""
|
|
66
|
+
from .setup import _atomic_hermes_config_write
|
|
67
|
+
for path, before, _ in updates:
|
|
68
|
+
if _read_owned_path(path) != before:
|
|
69
|
+
raise ValueError('Bundled skill changed during installation; current files were preserved')
|
|
70
|
+
completed = []
|
|
71
|
+
try:
|
|
72
|
+
for path, before, after in updates:
|
|
73
|
+
if before != after:
|
|
74
|
+
path.parent.mkdir(parents=True, exist_ok=True, mode=0o700)
|
|
75
|
+
_atomic_hermes_config_write(path, before, after)
|
|
76
|
+
completed.append((path, before, after))
|
|
77
|
+
except Exception:
|
|
78
|
+
for path, before, after in reversed(completed):
|
|
79
|
+
if _read_owned_path(path) == after:
|
|
80
|
+
if before is None:
|
|
81
|
+
path.unlink()
|
|
82
|
+
else:
|
|
83
|
+
_atomic_hermes_config_write(path, after, before)
|
|
84
|
+
# A failed first installation leaves no false ownership claim.
|
|
85
|
+
for directory in {path.parent for path, _, _ in updates}:
|
|
86
|
+
if directory.is_dir() and not any(directory.iterdir()):
|
|
87
|
+
directory.rmdir()
|
|
88
|
+
raise
|
|
89
|
+
names = sorted({path.parent.name for path, _, _ in updates})
|
|
90
|
+
print('Bundled skills available: '+', '.join(names)+'. With this Apsimo adapter version active, ongoing conversations refresh skill discovery on their next request.')
|
|
@@ -150,6 +150,11 @@ class TurnIdempotencyLedger:
|
|
|
150
150
|
)
|
|
151
151
|
)
|
|
152
152
|
""")
|
|
153
|
+
conn.execute("""
|
|
154
|
+
CREATE INDEX IF NOT EXISTS source_observation_origin ON turn_sources
|
|
155
|
+
(contact_id, json_extract(messages_json, '$[0]._observation_sources[0].source_id'), turn_id)
|
|
156
|
+
WHERE json_extract(messages_json, '$[0]._native_tool_observation') = 'native-tool-observation-v1'
|
|
157
|
+
""")
|
|
153
158
|
conn.execute("""
|
|
154
159
|
CREATE VIRTUAL TABLE IF NOT EXISTS turn_source_search USING fts5(
|
|
155
160
|
turn_id UNINDEXED, role UNINDEXED, content,
|
|
@@ -173,9 +173,11 @@ def expand(ledger, candidates, *, contact_id, session_id, covered=()):
|
|
|
173
173
|
own_annotation = conn.execute('SELECT * FROM source_annotations WHERE annotation_source_id=?',
|
|
174
174
|
(identifier,)).fetchone()
|
|
175
175
|
for message in row['messages']:
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
176
|
+
dependencies = (message.get('_supplied_sources', []) if message.get('role') == 'assistant'
|
|
177
|
+
else message.get('_observation_sources', []) if message.get('role') == 'tool'
|
|
178
|
+
and message.get('_native_tool_observation') == 'native-tool-observation-v1' else [])
|
|
179
|
+
if source_message_hash(row['session_id'], message) in selected_hashes:
|
|
180
|
+
for ref in dependencies:
|
|
179
181
|
parent = source(ref['source_id'])
|
|
180
182
|
if parent and canonical_turn_digest(parent['messages']) == ref['source_version']:
|
|
181
183
|
# Dedicated annotations have exact target message
|
|
@@ -71,7 +71,9 @@ def correct(ledger, *, operation_id, performed_by, old_contact_id, contact_id,
|
|
|
71
71
|
if row['turn_id'] in selected or row['turn_id'] in descendants:
|
|
72
72
|
continue
|
|
73
73
|
if any(ref.get('source_id') in pending for message in json.loads(row['messages_json'])
|
|
74
|
-
for ref in message.get('_supplied_sources', []))
|
|
74
|
+
for ref in (message.get('_supplied_sources', []) if message.get('role') == 'assistant'
|
|
75
|
+
else message.get('_observation_sources', []) if message.get('role') == 'tool'
|
|
76
|
+
and message.get('_native_tool_observation') == 'native-tool-observation-v1' else [])):
|
|
75
77
|
found.add(row['turn_id'])
|
|
76
78
|
descendants.update(found)
|
|
77
79
|
pending = found
|