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,143 @@
|
|
|
1
|
+
"""World Model seeder — creates self + subsystem ConceptEntities in the SQLite world model."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import time
|
|
7
|
+
import secrets
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from typing import Any, Optional
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _wm_id() -> str:
|
|
15
|
+
ts = int(time.time() * 1000)
|
|
16
|
+
rand = secrets.token_hex(4)
|
|
17
|
+
return f"we-{ts}-{rand}"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _wr_id() -> str:
|
|
21
|
+
ts = int(time.time() * 1000)
|
|
22
|
+
rand = secrets.token_hex(4)
|
|
23
|
+
return f"wr-{ts}-{rand}"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _now_dt() -> datetime:
|
|
27
|
+
return datetime.now(timezone.utc)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class WorldModelSeeder:
|
|
31
|
+
name = "world_model"
|
|
32
|
+
|
|
33
|
+
async def seed(self, corpus: Any) -> None:
|
|
34
|
+
"""Seed self-knowledge entities into the world model."""
|
|
35
|
+
try:
|
|
36
|
+
import colony.api.routers.world as wm_mod
|
|
37
|
+
backend = getattr(wm_mod, "_wm_backend", None)
|
|
38
|
+
except ImportError:
|
|
39
|
+
logger.debug("world_model: router not importable — skipping")
|
|
40
|
+
return
|
|
41
|
+
|
|
42
|
+
if backend is None:
|
|
43
|
+
logger.debug("world_model: _wm_backend is None — skipping")
|
|
44
|
+
return
|
|
45
|
+
|
|
46
|
+
from apsimo.world_model.entities import ConceptEntity
|
|
47
|
+
from apsimo.world_model.relationships import WorldRelationship
|
|
48
|
+
|
|
49
|
+
colony_id = corpus.colony_id
|
|
50
|
+
now = _now_dt()
|
|
51
|
+
|
|
52
|
+
# Self entity
|
|
53
|
+
self_id = f"colony-self-{colony_id}"
|
|
54
|
+
self_entity = ConceptEntity(
|
|
55
|
+
id=self_id,
|
|
56
|
+
name=corpus.colony_name,
|
|
57
|
+
entity_type="concept",
|
|
58
|
+
concept_type="colony_instance",
|
|
59
|
+
aliases=[colony_id, "self", corpus.colony_name],
|
|
60
|
+
confidence=1.0,
|
|
61
|
+
properties={
|
|
62
|
+
"colony_id": colony_id,
|
|
63
|
+
"colony_version": corpus.colony_version,
|
|
64
|
+
"network_id": corpus.network_id,
|
|
65
|
+
"public_key_hex": corpus.public_key_hex,
|
|
66
|
+
"corpus_version": corpus.corpus_version,
|
|
67
|
+
},
|
|
68
|
+
first_seen=now,
|
|
69
|
+
last_seen=now,
|
|
70
|
+
created_at=now,
|
|
71
|
+
updated_at=now,
|
|
72
|
+
)
|
|
73
|
+
try:
|
|
74
|
+
await backend.upsert_entity(self_entity)
|
|
75
|
+
except Exception as exc:
|
|
76
|
+
logger.warning("world_model: failed to upsert self entity: %s", exc)
|
|
77
|
+
return
|
|
78
|
+
|
|
79
|
+
# Subsystem concept entities + WM_PART_OF relationships
|
|
80
|
+
from apsimo.identity_bootstrap.corpus import SUBSYSTEMS
|
|
81
|
+
for subsystem in SUBSYSTEMS:
|
|
82
|
+
sub_id = f"colony-subsystem-{colony_id}-{subsystem}"
|
|
83
|
+
sub_entity = ConceptEntity(
|
|
84
|
+
id=sub_id,
|
|
85
|
+
name=f"{subsystem} subsystem",
|
|
86
|
+
entity_type="concept",
|
|
87
|
+
concept_type="colony_subsystem",
|
|
88
|
+
aliases=[subsystem],
|
|
89
|
+
confidence=1.0,
|
|
90
|
+
properties={
|
|
91
|
+
"subsystem_name": subsystem,
|
|
92
|
+
"parent_colony_id": colony_id,
|
|
93
|
+
},
|
|
94
|
+
first_seen=now,
|
|
95
|
+
last_seen=now,
|
|
96
|
+
created_at=now,
|
|
97
|
+
updated_at=now,
|
|
98
|
+
)
|
|
99
|
+
try:
|
|
100
|
+
await backend.upsert_entity(sub_entity)
|
|
101
|
+
except Exception as exc:
|
|
102
|
+
logger.warning("world_model: failed to upsert subsystem %s: %s", subsystem, exc)
|
|
103
|
+
continue
|
|
104
|
+
|
|
105
|
+
# WM_PART_OF: subsystem → self
|
|
106
|
+
rel_part_of = WorldRelationship(
|
|
107
|
+
id=_wr_id(),
|
|
108
|
+
source_id=sub_id,
|
|
109
|
+
target_id=self_id,
|
|
110
|
+
relationship_type="WM_PART_OF",
|
|
111
|
+
confidence=1.0,
|
|
112
|
+
properties={"seeded_by": "identity_bootstrap"},
|
|
113
|
+
)
|
|
114
|
+
try:
|
|
115
|
+
await backend.upsert_relationship(rel_part_of)
|
|
116
|
+
except Exception as exc:
|
|
117
|
+
logger.warning("world_model: WM_PART_OF rel failed for %s: %s", subsystem, exc)
|
|
118
|
+
|
|
119
|
+
# WM_DEPENDS_ON: goals → task_queue, intelligence → world_model
|
|
120
|
+
dep_pairs = [
|
|
121
|
+
("goals", "task_queue"),
|
|
122
|
+
("intelligence", "world_model"),
|
|
123
|
+
("briefings", "goals"),
|
|
124
|
+
("skills", "task_queue"),
|
|
125
|
+
("federation", "world_model"),
|
|
126
|
+
]
|
|
127
|
+
for src_sub, tgt_sub in dep_pairs:
|
|
128
|
+
src_id = f"colony-subsystem-{colony_id}-{src_sub}"
|
|
129
|
+
tgt_id = f"colony-subsystem-{colony_id}-{tgt_sub}"
|
|
130
|
+
rel = WorldRelationship(
|
|
131
|
+
id=_wr_id(),
|
|
132
|
+
source_id=src_id,
|
|
133
|
+
target_id=tgt_id,
|
|
134
|
+
relationship_type="WM_DEPENDS_ON",
|
|
135
|
+
confidence=0.95,
|
|
136
|
+
properties={"seeded_by": "identity_bootstrap"},
|
|
137
|
+
)
|
|
138
|
+
try:
|
|
139
|
+
await backend.upsert_relationship(rel)
|
|
140
|
+
except Exception as exc:
|
|
141
|
+
logger.debug("world_model: WM_DEPENDS_ON %s→%s failed: %s", src_sub, tgt_sub, exc)
|
|
142
|
+
|
|
143
|
+
logger.info("world_model: seeded self + %d subsystems", len(SUBSYSTEMS))
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Colony Identity Bootstrap — self-referential query detection.
|
|
2
|
+
|
|
3
|
+
Detects user messages that ask about Colony's own capabilities,
|
|
4
|
+
architecture, or identity, and builds grounding context from the
|
|
5
|
+
self-knowledge corpus so the agent can answer accurately.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import re
|
|
11
|
+
from typing import Optional
|
|
12
|
+
|
|
13
|
+
# Pre-compiled patterns for self-referential query detection.
|
|
14
|
+
# Each pattern targets a class of question about Colony's own capabilities.
|
|
15
|
+
_SELF_PATTERNS = [
|
|
16
|
+
# Capability / feature queries
|
|
17
|
+
re.compile(r"\bwhat\b.*\b(?:can you do|are your capabilities|features)\b", re.I),
|
|
18
|
+
re.compile(r"\bwhat\b.*\b(?:tools|commands|skills)\b.*\b(?:do you|you)\b", re.I),
|
|
19
|
+
re.compile(r"\bhow\b.*\bdo you work\b", re.I),
|
|
20
|
+
re.compile(r"\bwhat\b.*\b(?:endpoints?|api|routes?)\b.*\b(?:do you have|available|support)\b", re.I),
|
|
21
|
+
re.compile(r"\bwhat\b.*\bcommands?\b.*\b(?:do you|you)\b.*\bsupport\b", re.I),
|
|
22
|
+
# Architecture queries
|
|
23
|
+
re.compile(r"\bhow many\b.*\blayers?\b", re.I),
|
|
24
|
+
re.compile(r"\bwhat\b.*\b(?:is|are)\b.*\byour\b.*\barchitecture\b", re.I),
|
|
25
|
+
re.compile(r"\bwhat\b.*\bmodels?\b.*\b(?:do you use|you use)\b", re.I),
|
|
26
|
+
re.compile(r"\bwhat\b.*\b(?:inference|llm)\b.*\btiers?\b", re.I),
|
|
27
|
+
# Safety / gate queries
|
|
28
|
+
re.compile(r"\bwhat\b.*\b(?:safety|gate|security)\b.*\blayers?\b", re.I),
|
|
29
|
+
re.compile(r"\bresponse\s*gate\b", re.I),
|
|
30
|
+
# Identity queries
|
|
31
|
+
re.compile(r"\bwho\b.*\bare you\b", re.I),
|
|
32
|
+
re.compile(r"\bwhat\b.*\bare you\b", re.I),
|
|
33
|
+
re.compile(r"\btell me about yourself\b", re.I),
|
|
34
|
+
re.compile(r"\bdescribe yourself\b", re.I),
|
|
35
|
+
re.compile(r"\byour\b.*\b(?:version|colony.?id|identity)\b", re.I),
|
|
36
|
+
# Cognition pipeline queries
|
|
37
|
+
re.compile(r"\bcognition\b.*\b(?:pipeline|phases?)\b", re.I),
|
|
38
|
+
re.compile(r"\bself.?(?:improvement|learning|reflection)\b", re.I),
|
|
39
|
+
# Subsystem queries
|
|
40
|
+
re.compile(r"\bwhat\b.*\bsubsystems?\b", re.I),
|
|
41
|
+
re.compile(r"\blist\b.*\byour\b.*\b(?:systems?|components?)\b", re.I),
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def query_is_self_referential(message: str) -> bool:
|
|
46
|
+
"""Return True if *message* is asking about Colony's own capabilities."""
|
|
47
|
+
if not message or len(message) < 8:
|
|
48
|
+
return False
|
|
49
|
+
for pattern in _SELF_PATTERNS:
|
|
50
|
+
if pattern.search(message):
|
|
51
|
+
return True
|
|
52
|
+
return False
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def build_self_context_from_corpus() -> Optional[str]:
|
|
56
|
+
"""Build a grounding context block from the live SelfKnowledgeCorpus.
|
|
57
|
+
|
|
58
|
+
Returns a formatted string suitable for injection into the agent's
|
|
59
|
+
prompt, or None if the corpus cannot be loaded.
|
|
60
|
+
"""
|
|
61
|
+
try:
|
|
62
|
+
from apsimo.identity_bootstrap.builder import IdentityBootstrapBuilder
|
|
63
|
+
|
|
64
|
+
builder = IdentityBootstrapBuilder()
|
|
65
|
+
corpus = builder.build()
|
|
66
|
+
except Exception:
|
|
67
|
+
return None
|
|
68
|
+
|
|
69
|
+
lines = [
|
|
70
|
+
"# Colony Self-Knowledge (auto-injected)",
|
|
71
|
+
"",
|
|
72
|
+
f"**Identity:** {corpus.colony_name} (ID: {corpus.colony_id}, "
|
|
73
|
+
f"v{corpus.colony_version}, network: {corpus.network_id})",
|
|
74
|
+
"",
|
|
75
|
+
f"**Architecture:** {len(corpus.layers)} layers — "
|
|
76
|
+
+ ", ".join(l.name for l in corpus.layers),
|
|
77
|
+
"",
|
|
78
|
+
f"**API Endpoints:** {len(corpus.api_endpoints)} across "
|
|
79
|
+
f"{len(set(e.router for e in corpus.api_endpoints))} routers: "
|
|
80
|
+
+ ", ".join(sorted(set(e.router for e in corpus.api_endpoints))),
|
|
81
|
+
"",
|
|
82
|
+
f"**Cognition Pipeline:** {len(corpus.cognition_phases)} phases — "
|
|
83
|
+
+ ", ".join(p.name for p in corpus.cognition_phases),
|
|
84
|
+
"",
|
|
85
|
+
f"**ResponseGate:** {len(corpus.gate_layers)} safety layers — "
|
|
86
|
+
+ ", ".join(g.name for g in corpus.gate_layers),
|
|
87
|
+
"",
|
|
88
|
+
f"**Inference Tiers:** {len(corpus.inference_tiers)} — "
|
|
89
|
+
+ ", ".join(f"{t.name} ({t.complexity_range})" for t in corpus.inference_tiers),
|
|
90
|
+
"",
|
|
91
|
+
]
|
|
92
|
+
return "\n".join(lines)
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"""Colony Identity Bootstrap — SelfReflectionComponent.
|
|
2
|
+
|
|
3
|
+
Provides a lightweight self-reflection entry point for the CIB system.
|
|
4
|
+
A full self-reflection run analyses the bootstrap report anomalies
|
|
5
|
+
and produces an improvement proposal.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from dataclasses import dataclass, field
|
|
12
|
+
from typing import Any, List, Optional
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class SelfReflectionResult:
|
|
19
|
+
"""Output of one self-reflection cycle."""
|
|
20
|
+
colony_id: str
|
|
21
|
+
health_score: float # 0.0–1.0; 1.0 = all checks passed
|
|
22
|
+
critical_anomaly_count: int
|
|
23
|
+
warning_anomaly_count: int
|
|
24
|
+
improvement_proposals: List[str] = field(default_factory=list)
|
|
25
|
+
raw_notes: str = ""
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def healthy(self) -> bool:
|
|
29
|
+
return self.critical_anomaly_count == 0 and self.health_score >= 0.8
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class SelfReflectionComponent:
|
|
33
|
+
"""Analyses bootstrap anomalies and proposes improvements.
|
|
34
|
+
|
|
35
|
+
This is a lightweight reflection component — it does not call an LLM.
|
|
36
|
+
It uses rule-based heuristics over the anomaly list to generate proposals.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(self, metrics_collector: Optional[Any] = None) -> None:
|
|
40
|
+
self._metrics = metrics_collector
|
|
41
|
+
|
|
42
|
+
async def reflect(
|
|
43
|
+
self,
|
|
44
|
+
corpus: Any,
|
|
45
|
+
anomalies: List[Any],
|
|
46
|
+
) -> SelfReflectionResult:
|
|
47
|
+
"""Reflect on the given anomaly list and return a result."""
|
|
48
|
+
colony_id = corpus.colony_id
|
|
49
|
+
critical = [a for a in anomalies if a.severity == "CRITICAL"]
|
|
50
|
+
warnings = [a for a in anomalies if a.severity == "WARNING"]
|
|
51
|
+
|
|
52
|
+
total_checks = 18
|
|
53
|
+
passed = total_checks - len(anomalies)
|
|
54
|
+
health_score = max(0.0, passed / total_checks)
|
|
55
|
+
|
|
56
|
+
proposals = self._generate_proposals(critical, warnings)
|
|
57
|
+
|
|
58
|
+
notes = self._build_notes(colony_id, corpus, critical, warnings, health_score)
|
|
59
|
+
|
|
60
|
+
result = SelfReflectionResult(
|
|
61
|
+
colony_id=colony_id,
|
|
62
|
+
health_score=health_score,
|
|
63
|
+
critical_anomaly_count=len(critical),
|
|
64
|
+
warning_anomaly_count=len(warnings),
|
|
65
|
+
improvement_proposals=proposals,
|
|
66
|
+
raw_notes=notes,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# Record metric if available
|
|
70
|
+
if self._metrics is not None:
|
|
71
|
+
try:
|
|
72
|
+
await self._metrics.record(
|
|
73
|
+
metric_type="bootstrap_health_score",
|
|
74
|
+
value=health_score,
|
|
75
|
+
domain="identity",
|
|
76
|
+
context={"colony_id": colony_id},
|
|
77
|
+
)
|
|
78
|
+
except Exception as exc:
|
|
79
|
+
logger.debug("self_reflection: metrics record failed: %s", exc)
|
|
80
|
+
|
|
81
|
+
logger.info(
|
|
82
|
+
"self_reflection: colony=%s health=%.2f critical=%d warnings=%d",
|
|
83
|
+
colony_id,
|
|
84
|
+
health_score,
|
|
85
|
+
len(critical),
|
|
86
|
+
len(warnings),
|
|
87
|
+
)
|
|
88
|
+
return result
|
|
89
|
+
|
|
90
|
+
def _generate_proposals(self, critical: List[Any], warnings: List[Any]) -> List[str]:
|
|
91
|
+
proposals: List[str] = []
|
|
92
|
+
|
|
93
|
+
systems_with_issues = {a.system for a in critical + warnings}
|
|
94
|
+
|
|
95
|
+
if "world_model" in systems_with_issues:
|
|
96
|
+
proposals.append(
|
|
97
|
+
"Re-run WorldModelSeeder: world model entity or relationship is missing."
|
|
98
|
+
)
|
|
99
|
+
if "contacts" in systems_with_issues:
|
|
100
|
+
proposals.append(
|
|
101
|
+
"Re-run RelationshipSeeder: self-contact not found in contacts store."
|
|
102
|
+
)
|
|
103
|
+
if "memory" in systems_with_issues:
|
|
104
|
+
proposals.append(
|
|
105
|
+
"Re-run MemorySeeder: foundational memory entries are missing."
|
|
106
|
+
)
|
|
107
|
+
if "goals" in systems_with_issues:
|
|
108
|
+
proposals.append(
|
|
109
|
+
"Re-run GoalsSeeder: system goals not found — GoalStore may have been reset."
|
|
110
|
+
)
|
|
111
|
+
if "briefings" in systems_with_issues:
|
|
112
|
+
proposals.append(
|
|
113
|
+
"Re-run BriefingsSeeder: welcome briefing not found."
|
|
114
|
+
)
|
|
115
|
+
if "sessions" in systems_with_issues:
|
|
116
|
+
proposals.append(
|
|
117
|
+
"Re-run SessionsSeeder: bootstrap session record not found."
|
|
118
|
+
)
|
|
119
|
+
if "corpus" in systems_with_issues:
|
|
120
|
+
proposals.append(
|
|
121
|
+
"Update the identity_bootstrap corpus to match the current Colony version."
|
|
122
|
+
)
|
|
123
|
+
if any(a.check == "colony_id_set" for a in critical):
|
|
124
|
+
proposals.append(
|
|
125
|
+
"Set COLONY_ID env var or ensure ChainManager is initialized before bootstrap."
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
if not proposals and not critical and not warnings:
|
|
129
|
+
proposals.append("All checks passed — no improvements required.")
|
|
130
|
+
|
|
131
|
+
return proposals
|
|
132
|
+
|
|
133
|
+
def _build_notes(
|
|
134
|
+
self,
|
|
135
|
+
colony_id: str,
|
|
136
|
+
corpus: Any,
|
|
137
|
+
critical: List[Any],
|
|
138
|
+
warnings: List[Any],
|
|
139
|
+
health_score: float,
|
|
140
|
+
) -> str:
|
|
141
|
+
lines = [
|
|
142
|
+
f"Colony: {corpus.colony_name} ({colony_id})",
|
|
143
|
+
f"Version: {corpus.colony_version}",
|
|
144
|
+
f"Health: {health_score:.0%}",
|
|
145
|
+
f"Critical: {len(critical)} Warnings: {len(warnings)}",
|
|
146
|
+
]
|
|
147
|
+
if critical:
|
|
148
|
+
lines.append("--- CRITICAL ---")
|
|
149
|
+
for a in critical:
|
|
150
|
+
lines.append(f" [{a.system}] {a.check}: expected={a.expected!r} actual={a.actual!r}")
|
|
151
|
+
if warnings:
|
|
152
|
+
lines.append("--- WARNINGS ---")
|
|
153
|
+
for a in warnings:
|
|
154
|
+
lines.append(f" [{a.system}] {a.check}: expected={a.expected!r} actual={a.actual!r}")
|
|
155
|
+
return "\n".join(lines)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""bootstrap_self_check skill entry point.
|
|
2
|
+
|
|
3
|
+
Registered in the Colony skill registry as 'bootstrap-self-check'.
|
|
4
|
+
Runs the 16-point self-check matrix and returns a verification report.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Any, Optional
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
async def run(colony_id: Optional[str] = None, mode: str = "full") -> dict:
|
|
13
|
+
"""Run the Colony Identity Bootstrap self-check.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
colony_id: Override colony_id (default: read from running instance).
|
|
17
|
+
mode: "full" to run all checks, "quick" to skip slow subsystem checks.
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
Dict with verified_systems, failed_systems, anomalies, success.
|
|
21
|
+
"""
|
|
22
|
+
from apsimo.identity_bootstrap.runner import IdentityBootstrap
|
|
23
|
+
|
|
24
|
+
bootstrap = IdentityBootstrap()
|
|
25
|
+
report = await bootstrap.verify_only()
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
"colony_id": report.colony_id,
|
|
29
|
+
"mode": report.mode,
|
|
30
|
+
"verified_systems": report.verified_systems,
|
|
31
|
+
"failed_systems": report.failed_systems,
|
|
32
|
+
"anomalies": [a.to_dict() for a in report.anomalies],
|
|
33
|
+
"success": report.success,
|
|
34
|
+
"corpus_version": report.corpus_version,
|
|
35
|
+
"started_at": report.started_at,
|
|
36
|
+
"completed_at": report.completed_at,
|
|
37
|
+
}
|