apsimo 1.3.0__py3-none-any.whl
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/__init__.py +38 -0
- apsimo/__main__.py +6 -0
- apsimo/agent/__init__.py +6 -0
- apsimo/agent/client.py +276 -0
- apsimo/agent/models.py +46 -0
- apsimo/agents/__init__.py +20 -0
- apsimo/agents/models.py +264 -0
- apsimo/agents/store.py +861 -0
- apsimo/agents/websocket.py +522 -0
- apsimo/api/__init__.py +1 -0
- apsimo/api/auth_telemetry.py +287 -0
- apsimo/api/authority.py +1203 -0
- apsimo/api/contact_grants.py +347 -0
- apsimo/api/middleware.py +483 -0
- apsimo/api/routers/__init__.py +1 -0
- apsimo/api/routers/commitment_work.py +265 -0
- apsimo/api/routers/context_gate.py +123 -0
- apsimo/api/routers/executions.py +140 -0
- apsimo/api/routers/followup_plans.py +147 -0
- apsimo/api/routers/governed_actions.py +162 -0
- apsimo/api/routers/host.py +14473 -0
- apsimo/api/routers/initiative_work.py +115 -0
- apsimo/api/routers/mining.py +104 -0
- apsimo/api/routers/observations.py +110 -0
- apsimo/api/routers/social_state.py +225 -0
- apsimo/api/routers/task_queue.py +2715 -0
- apsimo/api/routers/temporal_followups.py +251 -0
- apsimo/api/routers/transport.py +110 -0
- apsimo/api/routers/transport_ingress_api.py +240 -0
- apsimo/api/schemas/__init__.py +1 -0
- apsimo/api/schemas/host.py +1949 -0
- apsimo/autonomy/cli.py +110 -0
- apsimo/autonomy/condition_worker.py +437 -0
- apsimo/autonomy/config.py +424 -0
- apsimo/autonomy/loop.py +4316 -0
- apsimo/autonomy/registry.py +339 -0
- apsimo/autonomy/scheduler.py +1822 -0
- apsimo/autonomy/synthesis.py +449 -0
- apsimo/backup.py +962 -0
- apsimo/beliefs/__init__.py +23 -0
- apsimo/beliefs/contradictions.py +109 -0
- apsimo/beliefs/decay.py +61 -0
- apsimo/beliefs/engine.py +479 -0
- apsimo/beliefs/models.py +67 -0
- apsimo/beliefs/promotion.py +41 -0
- apsimo/beliefs/resolve.py +58 -0
- apsimo/beliefs/source_claims.py +690 -0
- apsimo/beliefs/source_projection.py +883 -0
- apsimo/beliefs/source_time.py +208 -0
- apsimo/beliefs/store.py +133 -0
- apsimo/briefings/aggregators.py +824 -0
- apsimo/briefings/composer.py +420 -0
- apsimo/briefings/config.py +55 -0
- apsimo/briefings/delivery.py +439 -0
- apsimo/briefings/engagement.py +97 -0
- apsimo/briefings/engine.py +274 -0
- apsimo/briefings/enhancer.py +99 -0
- apsimo/briefings/models.py +183 -0
- apsimo/briefings/scheduler.py +382 -0
- apsimo/briefings/store.py +435 -0
- apsimo/chain/__init__.py +48 -0
- apsimo/chain/block.py +100 -0
- apsimo/chain/cli.py +704 -0
- apsimo/chain/genesis.py +443 -0
- apsimo/chain/identity.py +416 -0
- apsimo/chain/keys.py +1025 -0
- apsimo/chain/local_keys.py +187 -0
- apsimo/chain/manager.py +290 -0
- apsimo/chain/node.py +163 -0
- apsimo/chain/plugin_transactions.py +371 -0
- apsimo/chain/protocol.py +220 -0
- apsimo/chain/state_machine.py +676 -0
- apsimo/chain/storage.py +503 -0
- apsimo/chain/transactions.py +250 -0
- apsimo/chain/validation.py +397 -0
- apsimo/channels/__init__.py +1 -0
- apsimo/channels/manifest.py +31 -0
- apsimo/channels/migrations/001_channels_schema.sql +12 -0
- apsimo/channels/phone_gateways.py +42 -0
- apsimo/channels/presence.py +188 -0
- apsimo/channels/router.py +235 -0
- apsimo/channels/store.py +231 -0
- apsimo/cli.py +2688 -0
- apsimo/cognition/__init__.py +11 -0
- apsimo/cognition/charter.py +398 -0
- apsimo/cognition/drive_governance.py +3530 -0
- apsimo/cognition/evidence_pipeline.py +1627 -0
- apsimo/cognition/external_events.py +932 -0
- apsimo/cognition/goal_spine.py +3488 -0
- apsimo/cognition/introspection.py +214 -0
- apsimo/cognition/prompt.py +150 -0
- apsimo/cognition/runtime.py +108 -0
- apsimo/cognition/trigger.py +154 -0
- apsimo/commitments/__init__.py +18 -0
- apsimo/commitments/local_work.py +355 -0
- apsimo/commitments/store.py +1052 -0
- apsimo/commitments/work.py +91 -0
- apsimo/compat.py +53 -0
- apsimo/compression/__init__.py +467 -0
- apsimo/connectors/__init__.py +21 -0
- apsimo/connectors/base.py +152 -0
- apsimo/connectors/caldav_calendar.py +125 -0
- apsimo/connectors/fs_documents.py +85 -0
- apsimo/connectors/imap_email.py +138 -0
- apsimo/connectors/manager.py +218 -0
- apsimo/connectors/webhook_pull.py +88 -0
- apsimo/contacts/__init__.py +33 -0
- apsimo/contacts/comms.py +357 -0
- apsimo/contacts/config.py +79 -0
- apsimo/contacts/exporters/__init__.py +1 -0
- apsimo/contacts/exporters/vcard.py +71 -0
- apsimo/contacts/identity_links.py +251 -0
- apsimo/contacts/importer.py +280 -0
- apsimo/contacts/importers/__init__.py +1 -0
- apsimo/contacts/importers/batch.py +43 -0
- apsimo/contacts/importers/macos_contacts.py +101 -0
- apsimo/contacts/migrations/001_contacts_schema.sql +141 -0
- apsimo/contacts/migrations/002_trust_scopes.sql +36 -0
- apsimo/contacts/migrations/003_open_gateway_enum.sql +32 -0
- apsimo/contacts/migrations/004_contact_provision_operations.sql +18 -0
- apsimo/contacts/migrations/005_identity_links.sql +27 -0
- apsimo/contacts/models.py +308 -0
- apsimo/contacts/scoring.py +16 -0
- apsimo/contacts/store.py +1623 -0
- apsimo/contacts/transport_ingress.py +252 -0
- apsimo/contacts/world_bridge.py +314 -0
- apsimo/contextgate/__init__.py +69 -0
- apsimo/contextgate/chunker.py +169 -0
- apsimo/contextgate/estimate.py +54 -0
- apsimo/contextgate/gate.py +313 -0
- apsimo/contextgate/retrieve.py +115 -0
- apsimo/delivery/__init__.py +16 -0
- apsimo/delivery/bridge.py +1260 -0
- apsimo/delivery/channels.py +526 -0
- apsimo/delivery/classification.py +50 -0
- apsimo/delivery/rate_limiter.py +268 -0
- apsimo/delivery/reachout_policy.py +206 -0
- apsimo/directed/__init__.py +22 -0
- apsimo/directed/audit.py +167 -0
- apsimo/directed/intake.py +95 -0
- apsimo/directed/models.py +191 -0
- apsimo/directed/service.py +509 -0
- apsimo/directives/__init__.py +25 -0
- apsimo/directives/evidence.py +87 -0
- apsimo/directives/extractor.py +188 -0
- apsimo/directives/guard.py +364 -0
- apsimo/directives/models.py +206 -0
- apsimo/directives/service.py +372 -0
- apsimo/directives/store.py +167 -0
- apsimo/doctor.py +2173 -0
- apsimo/environment.py +43 -0
- apsimo/events/__init__.py +33 -0
- apsimo/events/broadcaster.py +98 -0
- apsimo/events/bus.py +217 -0
- apsimo/events/journal.py +863 -0
- apsimo/events/stream.py +131 -0
- apsimo/events/types.py +150 -0
- apsimo/execution_results.py +357 -0
- apsimo/feedback/__init__.py +5 -0
- apsimo/feedback/store.py +76 -0
- apsimo/feeds/__init__.py +19 -0
- apsimo/feeds/cli.py +84 -0
- apsimo/feeds/engine.py +437 -0
- apsimo/feeds/example-feed.yaml +77 -0
- apsimo/feeds/hermes_cron.py +126 -0
- apsimo/feeds/manager.py +235 -0
- apsimo/feeds/spec.py +250 -0
- apsimo/feeds/template.py +202 -0
- apsimo/gate/__init__.py +18 -0
- apsimo/gate/audit.py +61 -0
- apsimo/gate/communication_policy.py +166 -0
- apsimo/gate/config.py +72 -0
- apsimo/gate/context_provenance.py +170 -0
- apsimo/gate/env_risk.py +226 -0
- apsimo/gate/guard_audit.py +353 -0
- apsimo/gate/layers/__init__.py +1 -0
- apsimo/gate/layers/base.py +15 -0
- apsimo/gate/layers/l1_recipient.py +66 -0
- apsimo/gate/layers/l2_pii.py +134 -0
- apsimo/gate/layers/l3_cross_context.py +50 -0
- apsimo/gate/layers/l4_trust_tier.py +78 -0
- apsimo/gate/layers/l5_injection.py +199 -0
- apsimo/gate/layers/l6_review.py +86 -0
- apsimo/gate/layers/l7_delay.py +100 -0
- apsimo/gate/layers/tom2_epistemic.py +185 -0
- apsimo/gate/models.py +64 -0
- apsimo/gate/pending_dispatch.py +5 -0
- apsimo/gate/pipeline.py +206 -0
- apsimo/gate/rejection.py +259 -0
- apsimo/gate/response_guard.py +700 -0
- apsimo/gate/rulesets/injection_v1.yaml +51 -0
- apsimo/gate/surface_policy.py +189 -0
- apsimo/gate/taint.py +226 -0
- apsimo/genesis.json +9 -0
- apsimo/goals/__init__.py +100 -0
- apsimo/goals/config.py +38 -0
- apsimo/goals/decomposer.py +421 -0
- apsimo/goals/engine.py +617 -0
- apsimo/goals/inference.py +354 -0
- apsimo/goals/models.py +302 -0
- apsimo/goals/priority.py +270 -0
- apsimo/goals/queue_bridge.py +149 -0
- apsimo/goals/replan.py +450 -0
- apsimo/goals/schema.sql +89 -0
- apsimo/goals/store.py +692 -0
- apsimo/governed_actions.py +1708 -0
- apsimo/harness_integration/__init__.py +45 -0
- apsimo/harness_integration/context.py +41 -0
- apsimo/harness_integration/skills.py +231 -0
- apsimo/identity/__init__.py +26 -0
- apsimo/identity/participants.py +181 -0
- apsimo/identity/resolver.py +329 -0
- apsimo/identity_bootstrap/__init__.py +5 -0
- apsimo/identity_bootstrap/builder.py +208 -0
- apsimo/identity_bootstrap/corpus.py +443 -0
- apsimo/identity_bootstrap/models.py +54 -0
- apsimo/identity_bootstrap/runner.py +353 -0
- apsimo/identity_bootstrap/seeders/__init__.py +25 -0
- apsimo/identity_bootstrap/seeders/briefings.py +109 -0
- apsimo/identity_bootstrap/seeders/chain.py +57 -0
- apsimo/identity_bootstrap/seeders/goals.py +128 -0
- apsimo/identity_bootstrap/seeders/memory.py +191 -0
- apsimo/identity_bootstrap/seeders/neo4j_cognition.py +79 -0
- apsimo/identity_bootstrap/seeders/relationship.py +152 -0
- apsimo/identity_bootstrap/seeders/sessions.py +67 -0
- apsimo/identity_bootstrap/seeders/skills.py +92 -0
- apsimo/identity_bootstrap/seeders/task_queue.py +72 -0
- apsimo/identity_bootstrap/seeders/world_model.py +143 -0
- apsimo/identity_bootstrap/self_query.py +92 -0
- apsimo/identity_bootstrap/self_reflection.py +155 -0
- apsimo/identity_bootstrap/skill.py +37 -0
- apsimo/identity_bootstrap/verifier.py +436 -0
- apsimo/initiatives/__init__.py +20 -0
- apsimo/initiatives/action_registry.py +454 -0
- apsimo/initiatives/approval_authority.py +2105 -0
- apsimo/initiatives/approval_policy.py +123 -0
- apsimo/initiatives/assignment.py +263 -0
- apsimo/initiatives/backup_evidence.py +100 -0
- apsimo/initiatives/context_freshness.py +103 -0
- apsimo/initiatives/models.py +318 -0
- apsimo/initiatives/native_work.py +270 -0
- apsimo/initiatives/standing_approvals.py +232 -0
- apsimo/initiatives/store.py +1081 -0
- apsimo/initiatives/temporal_followup.py +410 -0
- apsimo/intelligence/__init__.py +1 -0
- apsimo/intelligence/cognition/__init__.py +24 -0
- apsimo/intelligence/cognition/gap_detector.py +148 -0
- apsimo/intelligence/cognition/metalearner.py +547 -0
- apsimo/intelligence/cognition/metrics_collector.py +217 -0
- apsimo/intelligence/cognition/performance_index.py +299 -0
- apsimo/intelligence/cognition/registry.py +192 -0
- apsimo/intelligence/cognition/strategy_adjuster.py +222 -0
- apsimo/intelligence/cognition/types.py +16 -0
- apsimo/intelligence/components/__init__.py +66 -0
- apsimo/intelligence/components/anomaly_detector.py +413 -0
- apsimo/intelligence/components/initiative_engine.py +2643 -0
- apsimo/intelligence/components/preference_learner.py +521 -0
- apsimo/intelligence/components/research_orchestrator.py +358 -0
- apsimo/intelligence/components/self_directed_thinker.py +221 -0
- apsimo/intelligence/components/self_reflector.py +252 -0
- apsimo/intelligence/components/session_continuity.py +154 -0
- apsimo/intelligence/components/task_planner.py +320 -0
- apsimo/intelligence/components/tool_learner.py +217 -0
- apsimo/intelligence/graph/__init__.py +79 -0
- apsimo/intelligence/graph/client.py +2483 -0
- apsimo/intelligence/graph/consolidator.py +405 -0
- apsimo/intelligence/graph/distiller.py +312 -0
- apsimo/intelligence/graph/migrations.py +129 -0
- apsimo/intelligence/graph/queries.py +248 -0
- apsimo/intelligence/graph/recall.py +281 -0
- apsimo/intelligence/graph/reconciler.py +144 -0
- apsimo/intelligence/graph/schema.py +337 -0
- apsimo/intelligence/graph/selection.py +252 -0
- apsimo/intelligence/learning/__init__.py +17 -0
- apsimo/intelligence/learning/continuous_learner.py +245 -0
- apsimo/intelligence/learning/feedback_store.py +321 -0
- apsimo/intelligence/mind_model/__init__.py +1 -0
- apsimo/intelligence/mind_model/graph_baseline.py +136 -0
- apsimo/intelligence/mind_model/signal_collector.py +361 -0
- apsimo/intelligence/relationships/__init__.py +11 -0
- apsimo/intelligence/relationships/profiler.py +389 -0
- apsimo/intelligence/relationships/scorer.py +560 -0
- apsimo/intelligence/relationships/signal_floor.py +66 -0
- apsimo/intelligence/relationships/trust_tiers.py +300 -0
- apsimo/intelligence/synthesis/__init__.py +40 -0
- apsimo/intelligence/synthesis/connection_discoverer.py +379 -0
- apsimo/intelligence/synthesis/cross_domain_analyzer.py +287 -0
- apsimo/intelligence/synthesis/insight_deliverer.py +171 -0
- apsimo/intelligence/synthesis/insight_store.py +79 -0
- apsimo/intelligence/synthesis/insight_validator.py +183 -0
- apsimo/intelligence/synthesis/novelty_scorer.py +267 -0
- apsimo/intelligence/turn_middleware/__init__.py +15 -0
- apsimo/intelligence/turn_middleware/memory_sync.py +119 -0
- apsimo/mcp/__init__.py +41 -0
- apsimo/mcp/__main__.py +6 -0
- apsimo/mcp/config.py +287 -0
- apsimo/mcp/server.py +501 -0
- apsimo/migrations.py +187 -0
- apsimo/mining/__init__.py +27 -0
- apsimo/mining/corpus.py +239 -0
- apsimo/mining/escalations.py +289 -0
- apsimo/mining/models.py +169 -0
- apsimo/mining/store.py +210 -0
- apsimo/models/__init__.py +30 -0
- apsimo/models/memory.py +80 -0
- apsimo/models/mesh.py +72 -0
- apsimo/models/person.py +104 -0
- apsimo/models/signal.py +108 -0
- apsimo/observations/__init__.py +15 -0
- apsimo/observations/store.py +277 -0
- apsimo/patterns/__init__.py +6 -0
- apsimo/patterns/extract.py +187 -0
- apsimo/patterns/store.py +227 -0
- apsimo/persona/__init__.py +1 -0
- apsimo/persona/engine.py +611 -0
- apsimo/persona/manifest.py +140 -0
- apsimo/projects/__init__.py +28 -0
- apsimo/projects/engine.py +1681 -0
- apsimo/projects/event_outbox.py +188 -0
- apsimo/projects/models.py +216 -0
- apsimo/projects/planner.py +181 -0
- apsimo/projects/store.py +1446 -0
- apsimo/proposals/__init__.py +12 -0
- apsimo/proposals/engine.py +114 -0
- apsimo/proposals/models.py +207 -0
- apsimo/qualification/__init__.py +1 -0
- apsimo/qualification/cases.py +75 -0
- apsimo/qualification/cli.py +51 -0
- apsimo/qualification/memory_cases.py +209 -0
- apsimo/qualification/records.py +92 -0
- apsimo/qualification/report.py +87 -0
- apsimo/qualification/runner.py +311 -0
- apsimo/qualification/structured_cases.py +131 -0
- apsimo/reasoning/__init__.py +13 -0
- apsimo/reasoning/executor.py +506 -0
- apsimo/reasoning/loop.py +373 -0
- apsimo/reasoning/native_tools/__init__.py +16 -0
- apsimo/reasoning/native_tools/calculate.py +141 -0
- apsimo/reasoning/native_tools/file_ops.py +150 -0
- apsimo/reasoning/native_tools/web_search.py +49 -0
- apsimo/reasoning/tool_policy.py +182 -0
- apsimo/redact/__init__.py +176 -0
- apsimo/repos/__init__.py +5 -0
- apsimo/repos/mirrors.py +204 -0
- apsimo/research/__init__.py +41 -0
- apsimo/research/artifact.py +482 -0
- apsimo/research/gatherer.py +387 -0
- apsimo/research/pipeline.py +513 -0
- apsimo/research/search/__init__.py +7 -0
- apsimo/research/search/base.py +41 -0
- apsimo/research/search/brave.py +59 -0
- apsimo/research/search/cache.py +51 -0
- apsimo/research/search/duckduckgo.py +103 -0
- apsimo/research/search/orchestrator.py +119 -0
- apsimo/research/search/serpapi.py +59 -0
- apsimo/research/search/tavily.py +59 -0
- apsimo/research/synthesizer.py +309 -0
- apsimo/router/__init__.py +30 -0
- apsimo/router/complexity_scorer.py +148 -0
- apsimo/router/endpoints.py +153 -0
- apsimo/router/fallback.py +58 -0
- apsimo/router/functions.py +243 -0
- apsimo/router/native_policy.py +52 -0
- apsimo/router/router.py +762 -0
- apsimo/router/self_learning.py +174 -0
- apsimo/router/tiers.py +677 -0
- apsimo/sandbox/__init__.py +21 -0
- apsimo/sandbox/backend.py +195 -0
- apsimo/sandbox/manager.py +173 -0
- apsimo/scope_bounds.py +7 -0
- apsimo/secrets/__init__.py +6 -0
- apsimo/secrets/backends/__init__.py +8 -0
- apsimo/secrets/backends/base.py +42 -0
- apsimo/secrets/backends/env.py +110 -0
- apsimo/secrets/backends/keyring.py +72 -0
- apsimo/secrets/backends/onepassword.py +232 -0
- apsimo/secrets/cli.py +191 -0
- apsimo/secrets/manager.py +160 -0
- apsimo/secrets/migration.py +101 -0
- apsimo/secrets/types.py +98 -0
- apsimo/seed.py +41 -0
- apsimo/self_model/__init__.py +37 -0
- apsimo/self_model/appraisals.py +673 -0
- apsimo/self_model/benchmark.py +1314 -0
- apsimo/self_model/brief.py +40 -0
- apsimo/self_model/event_concerns.py +1128 -0
- apsimo/self_model/execution_forecasts.py +353 -0
- apsimo/self_model/expectations.py +1595 -0
- apsimo/self_model/experiments.py +1150 -0
- apsimo/self_model/journal.py +148 -0
- apsimo/self_model/judgments.py +705 -0
- apsimo/self_model/native_outcomes.py +55 -0
- apsimo/self_model/params.py +220 -0
- apsimo/self_model/perspective.py +246 -0
- apsimo/self_model/reconcile.py +183 -0
- apsimo/self_model/reply_forecasts.py +381 -0
- apsimo/self_model/runtime_forecasts.py +296 -0
- apsimo/self_model/runtime_models.py +67 -0
- apsimo/self_model/settlement.py +207 -0
- apsimo/self_model/situation.py +1731 -0
- apsimo/self_model/store.py +883 -0
- apsimo/self_model/supervised.py +137 -0
- apsimo/self_model/thinker.py +99 -0
- apsimo/self_model/trust.py +388 -0
- apsimo/self_model/workspace.py +2388 -0
- apsimo/server.py +4197 -0
- apsimo/services/__init__.py +1 -0
- apsimo/services/agent_bridge.py +474 -0
- apsimo/services/initiative_executor.py +914 -0
- apsimo/services/instance.py +297 -0
- apsimo/sessions/__init__.py +22 -0
- apsimo/sessions/config.py +13 -0
- apsimo/sessions/context_loader.py +88 -0
- apsimo/sessions/federation_session.py +75 -0
- apsimo/sessions/isolated_session.py +98 -0
- apsimo/sessions/reports.py +84 -0
- apsimo/sessions/store.py +148 -0
- apsimo/setup.py +2818 -0
- apsimo/setup_hermes.py +879 -0
- apsimo/setup_local_work.py +218 -0
- apsimo/setup_native_goals.py +134 -0
- apsimo/setup_native_reviews.py +115 -0
- apsimo/skills/__init__.py +10 -0
- apsimo/skills/base.py +108 -0
- apsimo/skills/budget.py +28 -0
- apsimo/skills/executor.py +493 -0
- apsimo/skills/executors/__init__.py +1 -0
- apsimo/skills/executors/behavioral_correction.py +75 -0
- apsimo/skills/executors/capability_gap.py +38 -0
- apsimo/skills/executors/data_quality.py +163 -0
- apsimo/skills/executors/knowledge_acquisition.py +41 -0
- apsimo/skills/executors/operational_hygiene.py +185 -0
- apsimo/skills/executors/subsystem_health.py +169 -0
- apsimo/skills/hermes_export.py +431 -0
- apsimo/skills/index.py +123 -0
- apsimo/skills/learning/__init__.py +21 -0
- apsimo/skills/learning/novelty_detector.py +206 -0
- apsimo/skills/learning/pattern_extractor.py +199 -0
- apsimo/skills/learning/triggers.py +159 -0
- apsimo/skills/loader.py +246 -0
- apsimo/skills/migrations/002_progressive_loading.sql +6 -0
- apsimo/skills/migrations/backfill_triggers.py +20 -0
- apsimo/skills/models.py +202 -0
- apsimo/skills/packager.py +128 -0
- apsimo/skills/protocols.py +70 -0
- apsimo/skills/registry.py +191 -0
- apsimo/skills/runtime.py +58 -0
- apsimo/skills/sandbox_runner.py +229 -0
- apsimo/skills/scheduler.py +129 -0
- apsimo/skills/schema.py +79 -0
- apsimo/skills/security/__init__.py +12 -0
- apsimo/skills/security/guards.py +53 -0
- apsimo/skills/security/scanner.py +223 -0
- apsimo/skills_memory/__init__.py +26 -0
- apsimo/skills_memory/distill.py +159 -0
- apsimo/skills_memory/models.py +85 -0
- apsimo/skills_memory/retrieve.py +62 -0
- apsimo/skills_memory/store.py +172 -0
- apsimo/surprise/__init__.py +6 -0
- apsimo/surprise/accumulation.py +57 -0
- apsimo/surprise/scorer.py +102 -0
- apsimo/surprise/store.py +203 -0
- apsimo/task_queue/__init__.py +69 -0
- apsimo/task_queue/action_receipts.py +148 -0
- apsimo/task_queue/approval_relay_canary.py +108 -0
- apsimo/task_queue/config.py +85 -0
- apsimo/task_queue/contract.py +361 -0
- apsimo/task_queue/events.py +130 -0
- apsimo/task_queue/governor.py +1031 -0
- apsimo/task_queue/handlers/__init__.py +16 -0
- apsimo/task_queue/handlers/base.py +37 -0
- apsimo/task_queue/handlers/inference.py +640 -0
- apsimo/task_queue/handlers/monitoring.py +116 -0
- apsimo/task_queue/handlers/registry.py +75 -0
- apsimo/task_queue/handlers/subtask_handler.py +173 -0
- apsimo/task_queue/handlers/system_maintenance.py +147 -0
- apsimo/task_queue/mesh_integration.py +111 -0
- apsimo/task_queue/models.py +317 -0
- apsimo/task_queue/queue_manager.py +8286 -0
- apsimo/task_queue/routing.py +287 -0
- apsimo/task_queue/scheduler.py +252 -0
- apsimo/task_queue/schema.sql +197 -0
- apsimo/task_queue/work_control.py +342 -0
- apsimo/task_queue/worker.py +993 -0
- apsimo/telemetry.py +145 -0
- apsimo/tom/__init__.py +6 -0
- apsimo/tom/affect.py +387 -0
- apsimo/tom/approvals.py +171 -0
- apsimo/tom/arcs.py +896 -0
- apsimo/tom/asymmetry.py +131 -0
- apsimo/tom/eligibility.py +248 -0
- apsimo/tom/engagement.py +214 -0
- apsimo/tom/exposure.py +214 -0
- apsimo/tom/extractor.py +306 -0
- apsimo/tom/fact_adapters.py +144 -0
- apsimo/tom/facts.py +326 -0
- apsimo/tom/integration.py +592 -0
- apsimo/tom/leveled.py +118 -0
- apsimo/tom/levels.py +247 -0
- apsimo/tom/recipient_audit.py +995 -0
- apsimo/tom/recipient_simulator.py +593 -0
- apsimo/tom/source_lineage.py +93 -0
- apsimo/tom/tom2.py +277 -0
- apsimo/tom/visibility.py +559 -0
- apsimo/tom/visibility_store.py +414 -0
- apsimo/tools/__init__.py +0 -0
- apsimo/tools/definitions.py +740 -0
- apsimo/tools/handlers.py +943 -0
- apsimo/toolsmith/__init__.py +26 -0
- apsimo/toolsmith/authority.py +166 -0
- apsimo/toolsmith/engine.py +559 -0
- apsimo/toolsmith/integrity.py +100 -0
- apsimo/toolsmith/miner.py +145 -0
- apsimo/toolsmith/policy.py +110 -0
- apsimo/toolsmith/registry.py +635 -0
- apsimo/turns/__init__.py +17 -0
- apsimo/turns/audio.py +134 -0
- apsimo/turns/documents.py +235 -0
- apsimo/turns/executions.py +486 -0
- apsimo/turns/hermes_history.py +245 -0
- apsimo/turns/hermes_kanban.py +268 -0
- apsimo/turns/hermes_work.py +96 -0
- apsimo/turns/idempotency.py +752 -0
- apsimo/turns/local_work.py +115 -0
- apsimo/turns/media.py +581 -0
- apsimo/turns/reported_workers.py +196 -0
- apsimo/turns/source_annotations.py +283 -0
- apsimo/turns/source_attribution.py +154 -0
- apsimo/turns/source_read.py +351 -0
- apsimo/turns/source_vectors.py +263 -0
- apsimo/turns/video.py +210 -0
- apsimo/util/autonomy_preset.py +220 -0
- apsimo/util/instance.py +92 -0
- apsimo/util/model_output.py +25 -0
- apsimo/util/quiet_hours.py +27 -0
- apsimo/util/session_safety.py +37 -0
- apsimo/util/temporal.py +343 -0
- apsimo/vector/__init__.py +75 -0
- apsimo/vector/backfill.py +171 -0
- apsimo/vector/caption.py +114 -0
- apsimo/vector/collections.py +51 -0
- apsimo/vector/config.py +102 -0
- apsimo/vector/embedder.py +670 -0
- apsimo/vector/image_preprocess.py +406 -0
- apsimo/vector/image_store.py +296 -0
- apsimo/vector/indexes.py +162 -0
- apsimo/vector/migrate.py +334 -0
- apsimo/vector/multimodal_provider.py +417 -0
- apsimo/vector/multimodal_types.py +87 -0
- apsimo/vector/openai_provider.py +119 -0
- apsimo/vector/query.py +49 -0
- apsimo/vector/reranker.py +565 -0
- apsimo/vector/safety_image.py +159 -0
- apsimo/vector/scanner.py +197 -0
- apsimo/vector/setup.py +289 -0
- apsimo/vector/store.py +533 -0
- apsimo/vector/tiers.py +263 -0
- apsimo/work_orders.py +925 -0
- apsimo/workers/__init__.py +21 -0
- apsimo/workers/agent_bridge.py +640 -0
- apsimo/workers/colony_worker.py +382 -0
- apsimo/workers/queue_worker.py +441 -0
- apsimo/workers/skills_sync.py +152 -0
- apsimo/world_model/__init__.py +71 -0
- apsimo/world_model/causal_maintenance.py +131 -0
- apsimo/world_model/causal_policy.py +43 -0
- apsimo/world_model/causal_query.py +125 -0
- apsimo/world_model/confidence.py +54 -0
- apsimo/world_model/config.py +64 -0
- apsimo/world_model/constants.py +97 -0
- apsimo/world_model/entities.py +145 -0
- apsimo/world_model/expectation_resolvers.py +177 -0
- apsimo/world_model/extraction/__init__.py +7 -0
- apsimo/world_model/extraction/base.py +62 -0
- apsimo/world_model/extraction/conversation_extractor.py +262 -0
- apsimo/world_model/extraction/detector.py +74 -0
- apsimo/world_model/extraction/document_extractor.py +78 -0
- apsimo/world_model/extraction/formats/__init__.py +24 -0
- apsimo/world_model/extraction/formats/csv_fmt.py +68 -0
- apsimo/world_model/extraction/formats/html_fmt.py +72 -0
- apsimo/world_model/extraction/formats/json_fmt.py +68 -0
- apsimo/world_model/extraction/formats/pdf.py +43 -0
- apsimo/world_model/extraction/formats/text.py +27 -0
- apsimo/world_model/extraction/llm_extractor.py +164 -0
- apsimo/world_model/extraction/pipeline.py +73 -0
- apsimo/world_model/integrations/__init__.py +5 -0
- apsimo/world_model/integrations/mind_model_bridge.py +115 -0
- apsimo/world_model/integrations/social_intel_bridge.py +120 -0
- apsimo/world_model/jobs/__init__.py +4 -0
- apsimo/world_model/jobs/extraction_job.py +168 -0
- apsimo/world_model/llm_extract.py +572 -0
- apsimo/world_model/neo4j/__init__.py +5 -0
- apsimo/world_model/neo4j/backend.py +654 -0
- apsimo/world_model/observations.py +155 -0
- apsimo/world_model/populator.py +307 -0
- apsimo/world_model/postgres/__init__.py +1 -0
- apsimo/world_model/postgres/backend.py +683 -0
- apsimo/world_model/relationships.py +25 -0
- apsimo/world_model/resolution/__init__.py +13 -0
- apsimo/world_model/resolution/entity_resolver.py +232 -0
- apsimo/world_model/resolution/merge_audit.py +16 -0
- apsimo/world_model/resolution/merge_workflow.py +117 -0
- apsimo/world_model/source_reports.py +121 -0
- apsimo/world_model/sqlite/__init__.py +4 -0
- apsimo/world_model/sqlite/backend.py +855 -0
- apsimo/world_model/sqlite/schema.sql +132 -0
- apsimo/world_model/store.py +545 -0
- apsimo-1.3.0.dist-info/METADATA +78 -0
- apsimo-1.3.0.dist-info/RECORD +614 -0
- apsimo-1.3.0.dist-info/WHEEL +5 -0
- apsimo-1.3.0.dist-info/entry_points.txt +11 -0
- apsimo-1.3.0.dist-info/licenses/LICENSE +21 -0
- apsimo-1.3.0.dist-info/top_level.txt +2 -0
- colony_sidecar/__init__.py +4 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"""CognitionPipeline — auto-wiring container for the cognition pipeline.
|
|
2
|
+
|
|
3
|
+
Instantiates and connects MetricsCollector, PerformanceIndexComputer,
|
|
4
|
+
GapDetector, StrategyAdjuster, and MetaLearner into a single callable
|
|
5
|
+
pipeline. Called once at Colony startup; ``run_tick()`` is driven by the
|
|
6
|
+
autonomy loop on every event-processing cycle.
|
|
7
|
+
|
|
8
|
+
Usage::
|
|
9
|
+
|
|
10
|
+
pipeline = CognitionPipeline(graph=graph_client)
|
|
11
|
+
# In the autonomy loop tick:
|
|
12
|
+
await pipeline.run_tick()
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import logging
|
|
18
|
+
from typing import Any, Callable, List, Optional
|
|
19
|
+
|
|
20
|
+
from .gap_detector import GapDetector, GapSeverity
|
|
21
|
+
from .metalearner import MetaLearner, MetaLearnerConfig, CycleResult
|
|
22
|
+
from .metrics_collector import MetricsCollector
|
|
23
|
+
from .performance_index import PerformanceIndexComputer
|
|
24
|
+
from .strategy_adjuster import StrategyAdjuster
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class CognitionPipeline:
|
|
30
|
+
"""Auto-wiring container for the five cognition modules.
|
|
31
|
+
|
|
32
|
+
Connects MetricsCollector → PerformanceIndexComputer → GapDetector →
|
|
33
|
+
StrategyAdjuster → MetaLearner and exposes a single ``run_tick()``
|
|
34
|
+
coroutine that drives one full evaluate-detect-adjust cycle.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
graph: Colony graph client (passed through to sub-components).
|
|
38
|
+
event_bus: Optional event bus; if supplied, pipeline subscribes to
|
|
39
|
+
``goal.completed``, ``task.completed``, and ``anomaly.detected``
|
|
40
|
+
to record metrics in real time.
|
|
41
|
+
config: Optional MetaLearnerConfig to customise cycle behaviour.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(
|
|
45
|
+
self,
|
|
46
|
+
graph: Any,
|
|
47
|
+
event_bus: Optional[Any] = None,
|
|
48
|
+
config: Optional[MetaLearnerConfig] = None,
|
|
49
|
+
params: Optional[Any] = None,
|
|
50
|
+
) -> None:
|
|
51
|
+
self.graph = graph
|
|
52
|
+
self.event_bus = event_bus
|
|
53
|
+
|
|
54
|
+
# Instantiate sub-components
|
|
55
|
+
self.metrics = MetricsCollector(graph)
|
|
56
|
+
self.performance_index = PerformanceIndexComputer(graph)
|
|
57
|
+
self.gap_detector = GapDetector()
|
|
58
|
+
self.strategy_adjuster = StrategyAdjuster(graph, params=params)
|
|
59
|
+
self.meta_learner = MetaLearner(graph, config=config or MetaLearnerConfig())
|
|
60
|
+
|
|
61
|
+
# Wire sub-components into MetaLearner via dependency-injection setters
|
|
62
|
+
self.meta_learner.set_metrics_collector(self.metrics)
|
|
63
|
+
self.meta_learner.set_performance_index(self.performance_index)
|
|
64
|
+
self.meta_learner.set_gap_detector(self.gap_detector)
|
|
65
|
+
self.meta_learner.set_strategy_adjuster(self.strategy_adjuster)
|
|
66
|
+
|
|
67
|
+
# Subscribe to event-bus events if a bus was provided
|
|
68
|
+
if event_bus is not None:
|
|
69
|
+
self._subscribe(event_bus)
|
|
70
|
+
|
|
71
|
+
logger.info(
|
|
72
|
+
"CognitionPipeline initialised. Components: %s",
|
|
73
|
+
self.meta_learner.available_components,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# ── event-bus subscriptions ──────────────────────────────────────
|
|
77
|
+
|
|
78
|
+
def _subscribe(self, event_bus: Any) -> None:
|
|
79
|
+
"""Register event handlers on *event_bus*.
|
|
80
|
+
|
|
81
|
+
Supports any bus that exposes ``subscribe(event_name, callback)``.
|
|
82
|
+
Errors during subscription are logged but not raised so that the
|
|
83
|
+
pipeline degrades gracefully when the bus API differs.
|
|
84
|
+
"""
|
|
85
|
+
handlers: List[tuple[str, Callable]] = [
|
|
86
|
+
("goal.completed", self._on_goal_completed),
|
|
87
|
+
("task.completed", self._on_task_completed),
|
|
88
|
+
("anomaly.detected", self._on_anomaly),
|
|
89
|
+
]
|
|
90
|
+
for event_name, handler in handlers:
|
|
91
|
+
try:
|
|
92
|
+
event_bus.subscribe(event_name, handler)
|
|
93
|
+
logger.debug("CognitionPipeline subscribed to %r", event_name)
|
|
94
|
+
except Exception as exc:
|
|
95
|
+
logger.warning(
|
|
96
|
+
"CognitionPipeline: could not subscribe to %r: %s", event_name, exc
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
def _on_goal_completed(self, event: Any) -> None:
|
|
100
|
+
"""Record a goal-completed metric (synchronous hook)."""
|
|
101
|
+
import asyncio
|
|
102
|
+
try:
|
|
103
|
+
loop = asyncio.get_event_loop()
|
|
104
|
+
if loop.is_running():
|
|
105
|
+
loop.create_task(
|
|
106
|
+
self.metrics.record("goal_completed", 1.0, domain="goal_progress")
|
|
107
|
+
)
|
|
108
|
+
except Exception as exc:
|
|
109
|
+
logger.debug("CognitionPipeline._on_goal_completed error: %s", exc)
|
|
110
|
+
|
|
111
|
+
def _on_task_completed(self, event: Any) -> None:
|
|
112
|
+
"""Record a task-completed metric (synchronous hook)."""
|
|
113
|
+
import asyncio
|
|
114
|
+
try:
|
|
115
|
+
loop = asyncio.get_event_loop()
|
|
116
|
+
task_type = getattr(event, "task_type", None) or (
|
|
117
|
+
event.get("task_type") if isinstance(event, dict) else "unknown"
|
|
118
|
+
)
|
|
119
|
+
duration = getattr(event, "duration_minutes", None) or (
|
|
120
|
+
event.get("duration_minutes") if isinstance(event, dict) else 0.0
|
|
121
|
+
)
|
|
122
|
+
if loop.is_running():
|
|
123
|
+
loop.create_task(
|
|
124
|
+
self.metrics.record_task_completion(
|
|
125
|
+
str(task_type), float(duration or 0.0)
|
|
126
|
+
)
|
|
127
|
+
)
|
|
128
|
+
except Exception as exc:
|
|
129
|
+
logger.debug("CognitionPipeline._on_task_completed error: %s", exc)
|
|
130
|
+
|
|
131
|
+
def _on_anomaly(self, event: Any) -> None:
|
|
132
|
+
"""Record an anomaly signal (synchronous hook)."""
|
|
133
|
+
import asyncio
|
|
134
|
+
try:
|
|
135
|
+
loop = asyncio.get_event_loop()
|
|
136
|
+
if loop.is_running():
|
|
137
|
+
loop.create_task(
|
|
138
|
+
self.metrics.record("anomaly_detected", 1.0, domain="general")
|
|
139
|
+
)
|
|
140
|
+
except Exception as exc:
|
|
141
|
+
logger.debug("CognitionPipeline._on_anomaly error: %s", exc)
|
|
142
|
+
|
|
143
|
+
# ── main tick ────────────────────────────────────────────────────
|
|
144
|
+
|
|
145
|
+
async def run_tick(self) -> CycleResult:
|
|
146
|
+
"""Execute one full cognition cycle.
|
|
147
|
+
|
|
148
|
+
Called once per autonomy-loop tick. Runs:
|
|
149
|
+
1. Performance evaluation (compute CPI)
|
|
150
|
+
2. Gap detection
|
|
151
|
+
3. Strategy adjustment (up to ``config.max_adjustments_per_cycle``)
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
``CycleResult`` with CPI, detected gaps, and applied adjustments.
|
|
155
|
+
Errors within sub-steps are captured in ``result.errors`` rather
|
|
156
|
+
than propagated so the autonomy loop is never blocked.
|
|
157
|
+
"""
|
|
158
|
+
result = await self.meta_learner.run_cycle()
|
|
159
|
+
|
|
160
|
+
if result.errors:
|
|
161
|
+
logger.warning(
|
|
162
|
+
"CognitionPipeline.run_tick completed with %d error(s): %s",
|
|
163
|
+
len(result.errors),
|
|
164
|
+
"; ".join(result.errors[:3]),
|
|
165
|
+
)
|
|
166
|
+
else:
|
|
167
|
+
overall = result.cpi.overall if result.cpi else 0.0
|
|
168
|
+
gap_count = len(result.gaps)
|
|
169
|
+
logger.debug(
|
|
170
|
+
"CognitionPipeline.run_tick: CPI=%.1f, gaps=%d, adjustments=%d",
|
|
171
|
+
overall,
|
|
172
|
+
gap_count,
|
|
173
|
+
len(result.adjustments),
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
return result
|
|
177
|
+
|
|
178
|
+
# ── convenience accessors ────────────────────────────────────────
|
|
179
|
+
|
|
180
|
+
@property
|
|
181
|
+
def is_healthy(self) -> bool:
|
|
182
|
+
"""True if all five sub-components are wired."""
|
|
183
|
+
return self.meta_learner.is_fully_wired
|
|
184
|
+
|
|
185
|
+
async def record_metric(
|
|
186
|
+
self,
|
|
187
|
+
metric_type: str,
|
|
188
|
+
value: float,
|
|
189
|
+
domain: str = "general",
|
|
190
|
+
) -> None:
|
|
191
|
+
"""Convenience proxy: record a metric directly into the pipeline."""
|
|
192
|
+
await self.metrics.record(metric_type, value, domain=domain)
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"""Strategy adjustment for cognitive gaps."""
|
|
2
|
+
import logging
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Dict, Any, Optional
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from enum import Enum
|
|
7
|
+
|
|
8
|
+
from apsimo.self_model.benchmark import cognition_p4_mode
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AdjustmentStatus(str, Enum):
|
|
14
|
+
"""Status of an adjustment."""
|
|
15
|
+
PROPOSED = "proposed"
|
|
16
|
+
APPLIED = "applied"
|
|
17
|
+
FAILED = "failed"
|
|
18
|
+
REVERTED = "reverted"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class Adjustment:
|
|
23
|
+
"""Strategy adjustment for a gap."""
|
|
24
|
+
adjustment_type: str
|
|
25
|
+
hypothesis: str
|
|
26
|
+
target_gap: "Gap"
|
|
27
|
+
actions: list # List of action dicts
|
|
28
|
+
expected_impact: float # Expected CPI improvement
|
|
29
|
+
status: AdjustmentStatus = AdjustmentStatus.PROPOSED
|
|
30
|
+
applied_at: Optional[datetime] = None
|
|
31
|
+
result: Optional[Dict[str, Any]] = None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class StrategyAdjuster:
|
|
35
|
+
"""Generate experiment proposals from legacy CPI gaps.
|
|
36
|
+
|
|
37
|
+
This component is retained as a detector adapter. It deliberately never
|
|
38
|
+
writes an adaptive parameter or graph policy; ExperimentEngine is the one
|
|
39
|
+
controlled writer and requires exposure/outcome evidence.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
# Gap type to adjustment strategies mapping
|
|
43
|
+
STRATEGIES = {
|
|
44
|
+
"low_memory_quality": {
|
|
45
|
+
"hypothesis": "Memory retrieval quality is low due to weak embeddings",
|
|
46
|
+
"actions": [
|
|
47
|
+
{"type": "reindex_memories", "params": {}},
|
|
48
|
+
# Tighten the consolidator so near-miss pairs stop merging
|
|
49
|
+
# (weak embeddings inflate similarity; merging makes recall
|
|
50
|
+
# quality worse). Bounded by the param store [0.85, 0.98].
|
|
51
|
+
{"type": "adjust_consolidation_threshold", "params": {"threshold": 0.95}},
|
|
52
|
+
],
|
|
53
|
+
"expected_impact": 10.0,
|
|
54
|
+
},
|
|
55
|
+
"semantic_mismatch": {
|
|
56
|
+
"hypothesis": "Queries not matching stored memories semantically",
|
|
57
|
+
"actions": [
|
|
58
|
+
# Raise the recall relevance floor so low-score noise stops
|
|
59
|
+
# outranking real matches. Bounded by the param store [0, 0.5].
|
|
60
|
+
{"type": "adjust_similarity_threshold", "params": {"threshold": 0.35}},
|
|
61
|
+
{"type": "expand_query_terms", "params": {}},
|
|
62
|
+
],
|
|
63
|
+
"expected_impact": 8.0,
|
|
64
|
+
},
|
|
65
|
+
"insufficient_data": {
|
|
66
|
+
"hypothesis": "Not enough data to make accurate predictions",
|
|
67
|
+
"actions": [
|
|
68
|
+
{"type": "increase_observation_window", "params": {"days": 14}},
|
|
69
|
+
{"type": "prompt_user_for_data", "params": {}},
|
|
70
|
+
],
|
|
71
|
+
"expected_impact": 5.0,
|
|
72
|
+
},
|
|
73
|
+
"stale_data": {
|
|
74
|
+
"hypothesis": "Data is too old to be relevant",
|
|
75
|
+
"actions": [
|
|
76
|
+
{"type": "refresh_data_source", "params": {}},
|
|
77
|
+
{"type": "decay_old_signals", "params": {"factor": 0.5}},
|
|
78
|
+
],
|
|
79
|
+
"expected_impact": 7.0,
|
|
80
|
+
},
|
|
81
|
+
"missing_preference": {
|
|
82
|
+
"hypothesis": "User preference not captured",
|
|
83
|
+
"actions": [
|
|
84
|
+
{"type": "ask_preference", "params": {}},
|
|
85
|
+
{"type": "infer_from_behavior", "params": {}},
|
|
86
|
+
],
|
|
87
|
+
"expected_impact": 6.0,
|
|
88
|
+
},
|
|
89
|
+
"low_prediction_accuracy": {
|
|
90
|
+
"hypothesis": "Prediction model not calibrated to user patterns",
|
|
91
|
+
"actions": [
|
|
92
|
+
{"type": "recalibrate_baselines", "params": {}},
|
|
93
|
+
{"type": "adjust_confidence_threshold", "params": {"threshold": 0.6}},
|
|
94
|
+
],
|
|
95
|
+
"expected_impact": 12.0,
|
|
96
|
+
},
|
|
97
|
+
"tool_inefficiency": {
|
|
98
|
+
"hypothesis": "Tools being used suboptimally",
|
|
99
|
+
"actions": [
|
|
100
|
+
{"type": "audit_tool_usage", "params": {}},
|
|
101
|
+
{"type": "optimize_tool_selection", "params": {}},
|
|
102
|
+
],
|
|
103
|
+
"expected_impact": 8.0,
|
|
104
|
+
},
|
|
105
|
+
"initiative_mismatch": {
|
|
106
|
+
"hypothesis": "Proactive suggestions not matching user needs",
|
|
107
|
+
"actions": [
|
|
108
|
+
{"type": "adjust_suggestion_frequency", "params": {"factor": 0.7}},
|
|
109
|
+
{"type": "refine_suggestion_criteria", "params": {}},
|
|
110
|
+
],
|
|
111
|
+
"expected_impact": 6.0,
|
|
112
|
+
},
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
def __init__(self, graph: "ColonyGraph", params: Any = None):
|
|
116
|
+
self.graph = graph
|
|
117
|
+
# params remains a constructor compatibility argument. Only the
|
|
118
|
+
# ExperimentEngine owns parameter writes; this detector proposes.
|
|
119
|
+
self._experiment_proposer: Any = None
|
|
120
|
+
self._applied_adjustments: list = []
|
|
121
|
+
|
|
122
|
+
def set_experiment_proposer(self, proposer: Any) -> None:
|
|
123
|
+
"""Wire ExperimentEngine after boot without creating another writer."""
|
|
124
|
+
|
|
125
|
+
self._experiment_proposer = proposer
|
|
126
|
+
|
|
127
|
+
async def generate(self, gap: "Gap") -> Adjustment:
|
|
128
|
+
"""Generate adjustment strategy for a gap."""
|
|
129
|
+
gap_type_str = gap.gap_type.value if hasattr(gap.gap_type, "value") else str(gap.gap_type)
|
|
130
|
+
strategy = self.STRATEGIES.get(gap_type_str, self._default_strategy())
|
|
131
|
+
|
|
132
|
+
adjustment = Adjustment(
|
|
133
|
+
adjustment_type=gap_type_str,
|
|
134
|
+
hypothesis=strategy["hypothesis"],
|
|
135
|
+
target_gap=gap,
|
|
136
|
+
actions=strategy["actions"],
|
|
137
|
+
expected_impact=strategy["expected_impact"],
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
return adjustment
|
|
141
|
+
|
|
142
|
+
async def apply(self, adjustment: Adjustment) -> bool:
|
|
143
|
+
"""Record typed proposals without executing legacy adjustment actions."""
|
|
144
|
+
results = []
|
|
145
|
+
for action in adjustment.actions:
|
|
146
|
+
result = {
|
|
147
|
+
"success": False,
|
|
148
|
+
"action": action.get("type"),
|
|
149
|
+
"params": dict(action.get("params") or {}),
|
|
150
|
+
"proposal_required": True,
|
|
151
|
+
"reason": "legacy CPI detectors may propose; ExperimentEngine writes",
|
|
152
|
+
}
|
|
153
|
+
spec = self._experiment_spec(adjustment, action)
|
|
154
|
+
if spec is not None:
|
|
155
|
+
result["experiment_proposal"] = spec
|
|
156
|
+
if (self._experiment_proposer is not None
|
|
157
|
+
and cognition_p4_mode() in {"shadow", "live"}):
|
|
158
|
+
try:
|
|
159
|
+
saved = self._experiment_proposer.propose(**spec)
|
|
160
|
+
result["proposal_id"] = saved.get("id")
|
|
161
|
+
except ValueError as exc:
|
|
162
|
+
# An already-open proposal is the expected dedupe path.
|
|
163
|
+
result["proposal_error"] = str(exc)
|
|
164
|
+
results.append(result)
|
|
165
|
+
adjustment.result = {
|
|
166
|
+
"actions_taken": len(results),
|
|
167
|
+
"successful": 0,
|
|
168
|
+
"proposals": len(results),
|
|
169
|
+
"details": results,
|
|
170
|
+
}
|
|
171
|
+
adjustment.status = AdjustmentStatus.PROPOSED
|
|
172
|
+
logger.info(
|
|
173
|
+
"legacy cognition gap %s emitted %d controlled-learning proposal(s)",
|
|
174
|
+
adjustment.adjustment_type, len(results))
|
|
175
|
+
return False
|
|
176
|
+
|
|
177
|
+
@staticmethod
|
|
178
|
+
def _experiment_spec(adjustment: Adjustment,
|
|
179
|
+
action: dict) -> Optional[Dict[str, Any]]:
|
|
180
|
+
"""Map the two real legacy knobs into typed, non-started proposals."""
|
|
181
|
+
|
|
182
|
+
action_type = action.get("type")
|
|
183
|
+
raw = dict(action.get("params") or {})
|
|
184
|
+
if action_type == "adjust_similarity_threshold":
|
|
185
|
+
ref = "recall.min_relevance"
|
|
186
|
+
elif action_type == "adjust_consolidation_threshold":
|
|
187
|
+
ref = "consolidation.similarity_threshold"
|
|
188
|
+
else:
|
|
189
|
+
return None
|
|
190
|
+
if "threshold" not in raw:
|
|
191
|
+
return None
|
|
192
|
+
return {
|
|
193
|
+
"hypothesis": adjustment.hypothesis,
|
|
194
|
+
"ref": ref,
|
|
195
|
+
"variant": float(raw["threshold"]),
|
|
196
|
+
"metric": "recall.fact_coverage",
|
|
197
|
+
"metric_version": "v2",
|
|
198
|
+
"assignment_mode": "cohort",
|
|
199
|
+
"max_regression": 0.05,
|
|
200
|
+
"window_days": 7,
|
|
201
|
+
"source": f"legacy-cpi-gap:{adjustment.adjustment_type}",
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def _default_strategy(self) -> dict:
|
|
206
|
+
"""Default strategy for unknown gap types."""
|
|
207
|
+
return {
|
|
208
|
+
"hypothesis": "Performance gap detected, root cause unclear",
|
|
209
|
+
"actions": [
|
|
210
|
+
{"type": "log_gap", "params": {}},
|
|
211
|
+
{"type": "monitor", "params": {"duration_hours": 24}},
|
|
212
|
+
],
|
|
213
|
+
"expected_impact": 3.0,
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
def get_recent_adjustments(self, hours: int = 24) -> list:
|
|
217
|
+
"""Get recently applied adjustments."""
|
|
218
|
+
cutoff = datetime.now()
|
|
219
|
+
return [
|
|
220
|
+
adj for adj in self._applied_adjustments
|
|
221
|
+
if adj.applied_at and (cutoff - adj.applied_at).total_seconds() / 3600 < hours
|
|
222
|
+
]
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Shared types for the cognition package.
|
|
2
|
+
|
|
3
|
+
Centralising enums and dataclasses here breaks the circular dependency between
|
|
4
|
+
metalearner and gap_detector (both previously importing from each other).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from enum import Enum
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class GapSeverity(str, Enum):
|
|
13
|
+
"""Severity levels for cognitive performance gaps."""
|
|
14
|
+
CRITICAL = "critical"
|
|
15
|
+
WARNING = "warning"
|
|
16
|
+
INFO = "info"
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Specialized intelligence components.
|
|
2
|
+
|
|
3
|
+
Eight domain-specific components that provide tool learning, self-reflection,
|
|
4
|
+
task planning, session continuity, research orchestration, preference learning,
|
|
5
|
+
anomaly detection, and proactive initiative generation.
|
|
6
|
+
|
|
7
|
+
Public API:
|
|
8
|
+
- ``ToolLearner`` / ``ToolUsage`` / ``ToolPreference`` — learn tool preferences
|
|
9
|
+
- ``SelfReflector`` / ``Reflection`` — self-evaluation and improvement
|
|
10
|
+
- ``TaskPlanner`` / ``TaskPlan`` / ``SubTask`` / ``TaskPriority`` — task decomposition
|
|
11
|
+
- ``SessionContinuity`` / ``SessionContext`` — cross-session context
|
|
12
|
+
- ``ResearchOrchestrator`` / ``ResearchReport`` / ``ResearchResult`` / ``ResearchSource`` / ``SourceType`` — multi-source research
|
|
13
|
+
- ``PreferenceLearner`` / ``Preference`` — user preference extraction
|
|
14
|
+
- ``AnomalyDetector`` / ``Anomaly`` / ``AnomalyType`` — unusual pattern detection
|
|
15
|
+
- ``InitiativeEngine`` / ``Initiative`` / ``InitiativeType`` — proactive suggestions
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from .tool_learner import ToolLearner, ToolPreference, ToolUsage
|
|
19
|
+
from .self_reflector import Reflection, SelfReflector
|
|
20
|
+
from .task_planner import SubTask, TaskPlan, TaskPlanner, TaskPriority
|
|
21
|
+
from .session_continuity import SessionContext, SessionContinuity
|
|
22
|
+
from .research_orchestrator import (
|
|
23
|
+
ResearchOrchestrator,
|
|
24
|
+
ResearchReport,
|
|
25
|
+
ResearchResult,
|
|
26
|
+
ResearchSource,
|
|
27
|
+
SourceType,
|
|
28
|
+
)
|
|
29
|
+
from .preference_learner import Preference, PreferenceLearner
|
|
30
|
+
from .anomaly_detector import Anomaly, AnomalyDetector, AnomalyType
|
|
31
|
+
from .initiative_engine import Initiative, InitiativeEngine, InitiativeType
|
|
32
|
+
|
|
33
|
+
__all__ = [
|
|
34
|
+
# Tool learning
|
|
35
|
+
"ToolLearner",
|
|
36
|
+
"ToolUsage",
|
|
37
|
+
"ToolPreference",
|
|
38
|
+
# Self-reflection
|
|
39
|
+
"SelfReflector",
|
|
40
|
+
"Reflection",
|
|
41
|
+
# Task planning
|
|
42
|
+
"TaskPlanner",
|
|
43
|
+
"TaskPlan",
|
|
44
|
+
"SubTask",
|
|
45
|
+
"TaskPriority",
|
|
46
|
+
# Session continuity
|
|
47
|
+
"SessionContinuity",
|
|
48
|
+
"SessionContext",
|
|
49
|
+
# Research
|
|
50
|
+
"ResearchOrchestrator",
|
|
51
|
+
"ResearchReport",
|
|
52
|
+
"ResearchResult",
|
|
53
|
+
"ResearchSource",
|
|
54
|
+
"SourceType",
|
|
55
|
+
# Preferences
|
|
56
|
+
"PreferenceLearner",
|
|
57
|
+
"Preference",
|
|
58
|
+
# Anomaly detection
|
|
59
|
+
"AnomalyDetector",
|
|
60
|
+
"Anomaly",
|
|
61
|
+
"AnomalyType",
|
|
62
|
+
# Initiative
|
|
63
|
+
"InitiativeEngine",
|
|
64
|
+
"Initiative",
|
|
65
|
+
"InitiativeType",
|
|
66
|
+
]
|