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,424 @@
|
|
|
1
|
+
"""AutonomyLoop configuration dataclass."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import Optional
|
|
9
|
+
from enum import Enum
|
|
10
|
+
from zoneinfo import ZoneInfo
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AutonomyMode(str, Enum):
|
|
14
|
+
"""Autonomy loop operating mode."""
|
|
15
|
+
REACTIVE = "reactive" # On-demand only (default)
|
|
16
|
+
PROACTIVE = "proactive" # Timer-based
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _enabled_phases(value) -> Optional[tuple[str, ...]]:
|
|
20
|
+
if value is None:
|
|
21
|
+
return None
|
|
22
|
+
parts = value.split(',') if isinstance(value, str) else value
|
|
23
|
+
if not isinstance(parts, (list, tuple)) or not parts:
|
|
24
|
+
raise ValueError('enabled_phases must name at least one existing phase')
|
|
25
|
+
if any(not isinstance(part, str) or not part.strip() for part in parts):
|
|
26
|
+
raise ValueError('enabled_phases contains an empty or invalid name')
|
|
27
|
+
return tuple(dict.fromkeys(part.strip() for part in parts))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class InitiativeConfig:
|
|
32
|
+
"""Configuration for initiative deduplication and feedback (v0.7.10)."""
|
|
33
|
+
cooldown_hours: float = 24.0
|
|
34
|
+
cooldown_tasks: float = 12.0
|
|
35
|
+
cooldown_contacts: float = 72.0
|
|
36
|
+
max_snooze_hours: int = 168
|
|
37
|
+
feedback_enabled: bool = True
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass
|
|
41
|
+
class AutonomyConfig:
|
|
42
|
+
"""Configuration for the Colony autonomy loop.
|
|
43
|
+
|
|
44
|
+
All time values are in seconds unless noted.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
# Operating mode: reactive (on-demand) or proactive (timer-based)
|
|
48
|
+
mode: AutonomyMode = AutonomyMode.REACTIVE
|
|
49
|
+
|
|
50
|
+
# Where the mode came from: "env" (explicit COLONY_AUTONOMY_MODE),
|
|
51
|
+
# "preset" (COLONY_AUTONOMY_PRESET via preset-loop coupling, H4.1),
|
|
52
|
+
# "legacy_tick" (tick interval set without a mode), "config" (config
|
|
53
|
+
# file), or "default". Diagnostic only — surfaced in the posture
|
|
54
|
+
# endpoint so an operator can always see WHY the loop runs as it does.
|
|
55
|
+
mode_source: str = "default"
|
|
56
|
+
|
|
57
|
+
# None retains the existing phase set. A deployment can activate only the
|
|
58
|
+
# reviewed phases of this same loop without waking unrelated maintenance.
|
|
59
|
+
enabled_phases: Optional[tuple[str, ...]] = None
|
|
60
|
+
# Only affects the execute phase: persist proposals without legacy skill
|
|
61
|
+
# execution, queue dispatch, broadcasts or delivery. Other services retain
|
|
62
|
+
# their independent configuration and authority.
|
|
63
|
+
proposals_only: bool = False
|
|
64
|
+
|
|
65
|
+
# IANA timezone for quiet hours (e.g., "America/El_Salvador")
|
|
66
|
+
timezone: str = "UTC"
|
|
67
|
+
|
|
68
|
+
# How long to sleep between ticks when no events wake the loop early.
|
|
69
|
+
tick_interval_secs: float = 300.0
|
|
70
|
+
|
|
71
|
+
# Minimum initiative priority score [0.0–1.0] to execute an action.
|
|
72
|
+
initiative_confidence_threshold: float = 0.7
|
|
73
|
+
|
|
74
|
+
# Maximum autonomous actions taken per hour (safety limit).
|
|
75
|
+
max_actions_per_hour: int = 20
|
|
76
|
+
|
|
77
|
+
# Suppress non-urgent surfacing during quiet hours ("HH:MM" 24-hour format).
|
|
78
|
+
# Set both to "00:00" to disable quiet hours.
|
|
79
|
+
quiet_hours_start: str = "22:00"
|
|
80
|
+
quiet_hours_end: str = "07:00"
|
|
81
|
+
|
|
82
|
+
# Minimum anomaly severity [0.0–1.0] to surface to the initiative engine.
|
|
83
|
+
anomaly_severity_threshold: float = 0.6
|
|
84
|
+
|
|
85
|
+
# Minimum prediction confidence [0.0–1.0] to surface predictions.
|
|
86
|
+
prediction_confidence_threshold: float = 0.75
|
|
87
|
+
|
|
88
|
+
# Hours after which an active goal is considered stale.
|
|
89
|
+
goal_stale_threshold_hours: float = 24.0
|
|
90
|
+
|
|
91
|
+
# How often to run the identity bootstrap self-check (hours).
|
|
92
|
+
bootstrap_check_interval_hours: int = 24
|
|
93
|
+
|
|
94
|
+
# How often to run the self-reflection component (days).
|
|
95
|
+
self_reflection_interval_days: int = 7
|
|
96
|
+
|
|
97
|
+
# ── Owner check-in (silence-triggered proactive outreach) ──────────
|
|
98
|
+
# When no initiatives fire for this many hours, reach out to the owner.
|
|
99
|
+
owner_check_in_enabled: bool = False
|
|
100
|
+
owner_check_in_silent_hours: float = 1.0
|
|
101
|
+
owner_check_in_cooldown_hours: float = 4.0
|
|
102
|
+
owner_contact_id: Optional[str] = None # None = resolve from identity
|
|
103
|
+
|
|
104
|
+
# ── Proactive delivery (push initiatives to webhook) ────────────────
|
|
105
|
+
# When False, initiatives are stored but never pushed to the delivery bridge.
|
|
106
|
+
# The agent must poll via context-digest to see pending work.
|
|
107
|
+
proactive_delivery_enabled: bool = False
|
|
108
|
+
|
|
109
|
+
# ── Delivery shadow mode (outward-facing rollout safety) ────────────
|
|
110
|
+
# When True, reach-out initiatives that would be delivered are LOGGED
|
|
111
|
+
# (target + payload) but never sent, regardless of proactive_delivery_enabled.
|
|
112
|
+
# Lets an operator eyeball the intended first batch before enabling real
|
|
113
|
+
# sends. Real delivery requires proactive_delivery_enabled AND shadow off.
|
|
114
|
+
delivery_shadow_mode: bool = False
|
|
115
|
+
|
|
116
|
+
# ── Conversation synthesis (periodic memory scan for goals) ─────────
|
|
117
|
+
# Scans stored conversation memories for implicit goals and commitments.
|
|
118
|
+
conversation_synthesis_enabled: bool = True
|
|
119
|
+
conversation_synthesis_interval_secs: float = 1800.0 # 30 min
|
|
120
|
+
conversation_synthesis_lookback_hours: float = 2.0
|
|
121
|
+
conversation_synthesis_min_confidence: float = 0.35
|
|
122
|
+
|
|
123
|
+
# ── class methods ──────────────────────────────────────────────────
|
|
124
|
+
|
|
125
|
+
@classmethod
|
|
126
|
+
def from_colony_config(cls, colony_cfg: object) -> "AutonomyConfig":
|
|
127
|
+
"""Construct config from a Colony config object or dict.
|
|
128
|
+
|
|
129
|
+
Looks for an ``autonomy`` sub-key/attribute. If not found, returns
|
|
130
|
+
defaults. Supports both dict-like (``colony_cfg["autonomy"]``) and
|
|
131
|
+
object-like (``colony_cfg.autonomy``) configs.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
colony_cfg: Colony config object/dict, or None for defaults.
|
|
135
|
+
"""
|
|
136
|
+
if colony_cfg is None:
|
|
137
|
+
return cls()
|
|
138
|
+
|
|
139
|
+
# Extract the autonomy sub-section
|
|
140
|
+
autonomy_section = None
|
|
141
|
+
if isinstance(colony_cfg, dict):
|
|
142
|
+
autonomy_section = colony_cfg.get("autonomy")
|
|
143
|
+
else:
|
|
144
|
+
autonomy_section = getattr(colony_cfg, "autonomy", None)
|
|
145
|
+
|
|
146
|
+
if autonomy_section is None:
|
|
147
|
+
return cls()
|
|
148
|
+
|
|
149
|
+
# Read values from the section
|
|
150
|
+
def _get(key: str, default):
|
|
151
|
+
if isinstance(autonomy_section, dict):
|
|
152
|
+
return autonomy_section.get(key, default)
|
|
153
|
+
return getattr(autonomy_section, key, default)
|
|
154
|
+
|
|
155
|
+
defaults = cls()
|
|
156
|
+
|
|
157
|
+
# Mode and timezone
|
|
158
|
+
mode_str = str(_get("mode", "reactive")).lower()
|
|
159
|
+
mode = AutonomyMode(mode_str) if mode_str in [m.value for m in AutonomyMode] else AutonomyMode.REACTIVE
|
|
160
|
+
timezone = str(_get("timezone", "UTC"))
|
|
161
|
+
|
|
162
|
+
# Validate timezone
|
|
163
|
+
try:
|
|
164
|
+
ZoneInfo(timezone)
|
|
165
|
+
except Exception:
|
|
166
|
+
timezone = "UTC"
|
|
167
|
+
|
|
168
|
+
return cls(
|
|
169
|
+
mode=mode,
|
|
170
|
+
mode_source="config",
|
|
171
|
+
enabled_phases=_enabled_phases(_get("enabled_phases", None)),
|
|
172
|
+
proposals_only=bool(_get("proposals_only", False)),
|
|
173
|
+
timezone=timezone,
|
|
174
|
+
tick_interval_secs=float(_get("tick_interval_secs", defaults.tick_interval_secs)),
|
|
175
|
+
initiative_confidence_threshold=float(_get(
|
|
176
|
+
"initiative_confidence_threshold",
|
|
177
|
+
defaults.initiative_confidence_threshold,
|
|
178
|
+
)),
|
|
179
|
+
max_actions_per_hour=int(_get("max_actions_per_hour", defaults.max_actions_per_hour)),
|
|
180
|
+
quiet_hours_start=str(_get("quiet_hours_start", defaults.quiet_hours_start)),
|
|
181
|
+
quiet_hours_end=str(_get("quiet_hours_end", defaults.quiet_hours_end)),
|
|
182
|
+
anomaly_severity_threshold=float(_get(
|
|
183
|
+
"anomaly_severity_threshold",
|
|
184
|
+
defaults.anomaly_severity_threshold,
|
|
185
|
+
)),
|
|
186
|
+
prediction_confidence_threshold=float(_get(
|
|
187
|
+
"prediction_confidence_threshold",
|
|
188
|
+
defaults.prediction_confidence_threshold,
|
|
189
|
+
)),
|
|
190
|
+
goal_stale_threshold_hours=float(_get(
|
|
191
|
+
"goal_stale_threshold_hours",
|
|
192
|
+
defaults.goal_stale_threshold_hours,
|
|
193
|
+
)),
|
|
194
|
+
bootstrap_check_interval_hours=int(_get(
|
|
195
|
+
"bootstrap_check_interval_hours",
|
|
196
|
+
defaults.bootstrap_check_interval_hours,
|
|
197
|
+
)),
|
|
198
|
+
self_reflection_interval_days=int(_get(
|
|
199
|
+
"self_reflection_interval_days",
|
|
200
|
+
defaults.self_reflection_interval_days,
|
|
201
|
+
)),
|
|
202
|
+
owner_check_in_enabled=bool(_get("owner_check_in_enabled", defaults.owner_check_in_enabled)),
|
|
203
|
+
owner_check_in_silent_hours=float(_get(
|
|
204
|
+
"owner_check_in_silent_hours",
|
|
205
|
+
defaults.owner_check_in_silent_hours,
|
|
206
|
+
)),
|
|
207
|
+
owner_check_in_cooldown_hours=float(_get(
|
|
208
|
+
"owner_check_in_cooldown_hours",
|
|
209
|
+
defaults.owner_check_in_cooldown_hours,
|
|
210
|
+
)),
|
|
211
|
+
owner_contact_id=_get("owner_contact_id", defaults.owner_contact_id),
|
|
212
|
+
proactive_delivery_enabled=bool(
|
|
213
|
+
_get("proactive_delivery_enabled", defaults.proactive_delivery_enabled)
|
|
214
|
+
),
|
|
215
|
+
delivery_shadow_mode=bool(
|
|
216
|
+
_get("delivery_shadow_mode", defaults.delivery_shadow_mode)
|
|
217
|
+
),
|
|
218
|
+
conversation_synthesis_enabled=bool(_get(
|
|
219
|
+
"conversation_synthesis_enabled",
|
|
220
|
+
defaults.conversation_synthesis_enabled,
|
|
221
|
+
)),
|
|
222
|
+
conversation_synthesis_interval_secs=float(_get(
|
|
223
|
+
"conversation_synthesis_interval_secs",
|
|
224
|
+
defaults.conversation_synthesis_interval_secs,
|
|
225
|
+
)),
|
|
226
|
+
conversation_synthesis_lookback_hours=float(_get(
|
|
227
|
+
"conversation_synthesis_lookback_hours",
|
|
228
|
+
defaults.conversation_synthesis_lookback_hours,
|
|
229
|
+
)),
|
|
230
|
+
conversation_synthesis_min_confidence=float(_get(
|
|
231
|
+
"conversation_synthesis_min_confidence",
|
|
232
|
+
defaults.conversation_synthesis_min_confidence,
|
|
233
|
+
)),
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
@classmethod
|
|
237
|
+
def from_env(cls) -> "AutonomyConfig":
|
|
238
|
+
"""Construct config from environment variables.
|
|
239
|
+
|
|
240
|
+
All env vars are optional; unset vars fall back to field defaults.
|
|
241
|
+
|
|
242
|
+
Environment variables:
|
|
243
|
+
COLONY_AUTONOMY_MODE
|
|
244
|
+
COLONY_AUTONOMY_PHASES (comma-separated existing phase names)
|
|
245
|
+
COLONY_AUTONOMY_PROPOSALS_ONLY
|
|
246
|
+
COLONY_PRESET_LOOP_COUPLING (default on: an active
|
|
247
|
+
COLONY_AUTONOMY_PRESET supplies the mode when
|
|
248
|
+
COLONY_AUTONOMY_MODE is unset)
|
|
249
|
+
COLONY_TIMEZONE
|
|
250
|
+
COLONY_AUTONOMY_TICK_INTERVAL_SECS
|
|
251
|
+
COLONY_AUTONOMY_INITIATIVE_CONFIDENCE_THRESHOLD
|
|
252
|
+
COLONY_AUTONOMY_MAX_ACTIONS_PER_HOUR
|
|
253
|
+
COLONY_AUTONOMY_QUIET_HOURS_START
|
|
254
|
+
COLONY_AUTONOMY_QUIET_HOURS_END
|
|
255
|
+
COLONY_AUTONOMY_ANOMALY_SEVERITY_THRESHOLD
|
|
256
|
+
COLONY_AUTONOMY_PREDICTION_CONFIDENCE_THRESHOLD
|
|
257
|
+
COLONY_AUTONOMY_GOAL_STALE_THRESHOLD_HOURS
|
|
258
|
+
COLONY_OWNER_CHECK_IN_ENABLED
|
|
259
|
+
COLONY_OWNER_CHECK_IN_SILENT_HOURS
|
|
260
|
+
COLONY_OWNER_CHECK_IN_COOLDOWN_HOURS
|
|
261
|
+
COLONY_OWNER_CONTACT_ID
|
|
262
|
+
COLONY_PROACTIVE_DELIVERY_ENABLED
|
|
263
|
+
COLONY_DELIVERY_SHADOW
|
|
264
|
+
COLONY_CONVERSATION_SYNTHESIS_ENABLED
|
|
265
|
+
COLONY_CONVERSATION_SYNTHESIS_INTERVAL_SECS
|
|
266
|
+
COLONY_CONVERSATION_SYNTHESIS_LOOKBACK_HOURS
|
|
267
|
+
COLONY_CONVERSATION_SYNTHESIS_MIN_CONFIDENCE
|
|
268
|
+
"""
|
|
269
|
+
logger = logging.getLogger(__name__)
|
|
270
|
+
|
|
271
|
+
# Mode selection. Precedence (H4.1):
|
|
272
|
+
# explicit COLONY_AUTONOMY_MODE > coupled preset mode
|
|
273
|
+
# > legacy tick-interval migration > default (reactive)
|
|
274
|
+
# Explicit env ALWAYS wins — COLONY_AUTONOMY_MODE=reactive is the
|
|
275
|
+
# rollback path even under a preset. Coupling errors fail toward
|
|
276
|
+
# reactive (coupled_loop_mode never raises; a broken import just
|
|
277
|
+
# falls through to the legacy resolution).
|
|
278
|
+
mode = AutonomyMode.REACTIVE
|
|
279
|
+
mode_source = "default"
|
|
280
|
+
raw_mode = os.environ.get("COLONY_AUTONOMY_MODE")
|
|
281
|
+
if raw_mode is not None and raw_mode.strip():
|
|
282
|
+
mode_str = raw_mode.strip().lower()
|
|
283
|
+
mode = (AutonomyMode(mode_str)
|
|
284
|
+
if mode_str in [m.value for m in AutonomyMode]
|
|
285
|
+
else AutonomyMode.REACTIVE)
|
|
286
|
+
mode_source = "env"
|
|
287
|
+
else:
|
|
288
|
+
coupled = None
|
|
289
|
+
try:
|
|
290
|
+
from apsimo.util.autonomy_preset import coupled_loop_mode
|
|
291
|
+
coupled = coupled_loop_mode()
|
|
292
|
+
except Exception:
|
|
293
|
+
coupled = None # fail toward reactive
|
|
294
|
+
if coupled in ("reactive", "proactive"):
|
|
295
|
+
mode = AutonomyMode(coupled)
|
|
296
|
+
mode_source = "preset"
|
|
297
|
+
|
|
298
|
+
# Timezone
|
|
299
|
+
timezone = os.environ.get("COLONY_TIMEZONE", "UTC")
|
|
300
|
+
try:
|
|
301
|
+
ZoneInfo(timezone)
|
|
302
|
+
except Exception:
|
|
303
|
+
logger.warning("Invalid COLONY_TIMEZONE '%s', falling back to UTC", timezone)
|
|
304
|
+
timezone = "UTC"
|
|
305
|
+
|
|
306
|
+
# Legacy migration: if tick interval set without mode (and no coupled
|
|
307
|
+
# preset supplied one), assume proactive
|
|
308
|
+
legacy_tick = os.environ.get("COLONY_AUTONOMY_TICK_INTERVAL_SECS")
|
|
309
|
+
if legacy_tick and mode_source == "default":
|
|
310
|
+
logger.warning(
|
|
311
|
+
"COLONY_AUTONOMY_TICK_INTERVAL_SECS set without COLONY_AUTONOMY_MODE. "
|
|
312
|
+
"Defaulting to PROACTIVE mode to preserve existing behavior. "
|
|
313
|
+
"Add COLONY_AUTONOMY_MODE=proactive to make this explicit."
|
|
314
|
+
)
|
|
315
|
+
mode = AutonomyMode.PROACTIVE
|
|
316
|
+
mode_source = "legacy_tick"
|
|
317
|
+
|
|
318
|
+
def _float(key: str, default: float) -> float:
|
|
319
|
+
v = os.environ.get(key)
|
|
320
|
+
return float(v) if v is not None else default
|
|
321
|
+
|
|
322
|
+
def _int(key: str, default: int) -> int:
|
|
323
|
+
v = os.environ.get(key)
|
|
324
|
+
return int(v) if v is not None else default
|
|
325
|
+
|
|
326
|
+
def _str(key: str, default: str) -> str:
|
|
327
|
+
return os.environ.get(key, default)
|
|
328
|
+
|
|
329
|
+
def _bool(key: str, default: bool) -> bool:
|
|
330
|
+
v = os.environ.get(key, "").lower()
|
|
331
|
+
if v == "true":
|
|
332
|
+
return True
|
|
333
|
+
if v == "false":
|
|
334
|
+
return False
|
|
335
|
+
return default
|
|
336
|
+
|
|
337
|
+
defaults = cls()
|
|
338
|
+
return cls(
|
|
339
|
+
mode=mode,
|
|
340
|
+
mode_source=mode_source,
|
|
341
|
+
enabled_phases=_enabled_phases(os.environ.get("COLONY_AUTONOMY_PHASES")),
|
|
342
|
+
proposals_only=_bool("COLONY_AUTONOMY_PROPOSALS_ONLY", False),
|
|
343
|
+
timezone=timezone,
|
|
344
|
+
tick_interval_secs=_float(
|
|
345
|
+
"COLONY_AUTONOMY_TICK_INTERVAL_SECS",
|
|
346
|
+
defaults.tick_interval_secs,
|
|
347
|
+
),
|
|
348
|
+
initiative_confidence_threshold=_float(
|
|
349
|
+
"COLONY_AUTONOMY_INITIATIVE_CONFIDENCE_THRESHOLD",
|
|
350
|
+
defaults.initiative_confidence_threshold,
|
|
351
|
+
),
|
|
352
|
+
max_actions_per_hour=_int(
|
|
353
|
+
"COLONY_AUTONOMY_MAX_ACTIONS_PER_HOUR",
|
|
354
|
+
defaults.max_actions_per_hour,
|
|
355
|
+
),
|
|
356
|
+
quiet_hours_start=_str(
|
|
357
|
+
"COLONY_AUTONOMY_QUIET_HOURS_START",
|
|
358
|
+
defaults.quiet_hours_start,
|
|
359
|
+
),
|
|
360
|
+
quiet_hours_end=_str(
|
|
361
|
+
"COLONY_AUTONOMY_QUIET_HOURS_END",
|
|
362
|
+
defaults.quiet_hours_end,
|
|
363
|
+
),
|
|
364
|
+
anomaly_severity_threshold=_float(
|
|
365
|
+
"COLONY_AUTONOMY_ANOMALY_SEVERITY_THRESHOLD",
|
|
366
|
+
defaults.anomaly_severity_threshold,
|
|
367
|
+
),
|
|
368
|
+
prediction_confidence_threshold=_float(
|
|
369
|
+
"COLONY_AUTONOMY_PREDICTION_CONFIDENCE_THRESHOLD",
|
|
370
|
+
defaults.prediction_confidence_threshold,
|
|
371
|
+
),
|
|
372
|
+
goal_stale_threshold_hours=_float(
|
|
373
|
+
"COLONY_AUTONOMY_GOAL_STALE_THRESHOLD_HOURS",
|
|
374
|
+
defaults.goal_stale_threshold_hours,
|
|
375
|
+
),
|
|
376
|
+
bootstrap_check_interval_hours=_int(
|
|
377
|
+
"COLONY_AUTONOMY_BOOTSTRAP_CHECK_INTERVAL_HOURS",
|
|
378
|
+
defaults.bootstrap_check_interval_hours,
|
|
379
|
+
),
|
|
380
|
+
self_reflection_interval_days=_int(
|
|
381
|
+
"COLONY_AUTONOMY_SELF_REFLECTION_INTERVAL_DAYS",
|
|
382
|
+
defaults.self_reflection_interval_days,
|
|
383
|
+
),
|
|
384
|
+
owner_check_in_enabled=_bool(
|
|
385
|
+
"COLONY_OWNER_CHECK_IN_ENABLED",
|
|
386
|
+
defaults.owner_check_in_enabled,
|
|
387
|
+
),
|
|
388
|
+
owner_check_in_silent_hours=_float(
|
|
389
|
+
"COLONY_OWNER_CHECK_IN_SILENT_HOURS",
|
|
390
|
+
defaults.owner_check_in_silent_hours,
|
|
391
|
+
),
|
|
392
|
+
owner_check_in_cooldown_hours=_float(
|
|
393
|
+
"COLONY_OWNER_CHECK_IN_COOLDOWN_HOURS",
|
|
394
|
+
defaults.owner_check_in_cooldown_hours,
|
|
395
|
+
),
|
|
396
|
+
owner_contact_id=os.environ.get(
|
|
397
|
+
"COLONY_OWNER_CONTACT_ID",
|
|
398
|
+
defaults.owner_contact_id,
|
|
399
|
+
),
|
|
400
|
+
proactive_delivery_enabled=_bool(
|
|
401
|
+
"COLONY_PROACTIVE_DELIVERY_ENABLED",
|
|
402
|
+
defaults.proactive_delivery_enabled,
|
|
403
|
+
),
|
|
404
|
+
delivery_shadow_mode=_bool(
|
|
405
|
+
"COLONY_DELIVERY_SHADOW",
|
|
406
|
+
defaults.delivery_shadow_mode,
|
|
407
|
+
),
|
|
408
|
+
conversation_synthesis_enabled=_bool(
|
|
409
|
+
"COLONY_CONVERSATION_SYNTHESIS_ENABLED",
|
|
410
|
+
defaults.conversation_synthesis_enabled,
|
|
411
|
+
),
|
|
412
|
+
conversation_synthesis_interval_secs=_float(
|
|
413
|
+
"COLONY_CONVERSATION_SYNTHESIS_INTERVAL_SECS",
|
|
414
|
+
defaults.conversation_synthesis_interval_secs,
|
|
415
|
+
),
|
|
416
|
+
conversation_synthesis_lookback_hours=_float(
|
|
417
|
+
"COLONY_CONVERSATION_SYNTHESIS_LOOKBACK_HOURS",
|
|
418
|
+
defaults.conversation_synthesis_lookback_hours,
|
|
419
|
+
),
|
|
420
|
+
conversation_synthesis_min_confidence=_float(
|
|
421
|
+
"COLONY_CONVERSATION_SYNTHESIS_MIN_CONFIDENCE",
|
|
422
|
+
defaults.conversation_synthesis_min_confidence,
|
|
423
|
+
),
|
|
424
|
+
)
|