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.
Files changed (614) hide show
  1. apsimo/__init__.py +38 -0
  2. apsimo/__main__.py +6 -0
  3. apsimo/agent/__init__.py +6 -0
  4. apsimo/agent/client.py +276 -0
  5. apsimo/agent/models.py +46 -0
  6. apsimo/agents/__init__.py +20 -0
  7. apsimo/agents/models.py +264 -0
  8. apsimo/agents/store.py +861 -0
  9. apsimo/agents/websocket.py +522 -0
  10. apsimo/api/__init__.py +1 -0
  11. apsimo/api/auth_telemetry.py +287 -0
  12. apsimo/api/authority.py +1203 -0
  13. apsimo/api/contact_grants.py +347 -0
  14. apsimo/api/middleware.py +483 -0
  15. apsimo/api/routers/__init__.py +1 -0
  16. apsimo/api/routers/commitment_work.py +265 -0
  17. apsimo/api/routers/context_gate.py +123 -0
  18. apsimo/api/routers/executions.py +140 -0
  19. apsimo/api/routers/followup_plans.py +147 -0
  20. apsimo/api/routers/governed_actions.py +162 -0
  21. apsimo/api/routers/host.py +14473 -0
  22. apsimo/api/routers/initiative_work.py +115 -0
  23. apsimo/api/routers/mining.py +104 -0
  24. apsimo/api/routers/observations.py +110 -0
  25. apsimo/api/routers/social_state.py +225 -0
  26. apsimo/api/routers/task_queue.py +2715 -0
  27. apsimo/api/routers/temporal_followups.py +251 -0
  28. apsimo/api/routers/transport.py +110 -0
  29. apsimo/api/routers/transport_ingress_api.py +240 -0
  30. apsimo/api/schemas/__init__.py +1 -0
  31. apsimo/api/schemas/host.py +1949 -0
  32. apsimo/autonomy/cli.py +110 -0
  33. apsimo/autonomy/condition_worker.py +437 -0
  34. apsimo/autonomy/config.py +424 -0
  35. apsimo/autonomy/loop.py +4316 -0
  36. apsimo/autonomy/registry.py +339 -0
  37. apsimo/autonomy/scheduler.py +1822 -0
  38. apsimo/autonomy/synthesis.py +449 -0
  39. apsimo/backup.py +962 -0
  40. apsimo/beliefs/__init__.py +23 -0
  41. apsimo/beliefs/contradictions.py +109 -0
  42. apsimo/beliefs/decay.py +61 -0
  43. apsimo/beliefs/engine.py +479 -0
  44. apsimo/beliefs/models.py +67 -0
  45. apsimo/beliefs/promotion.py +41 -0
  46. apsimo/beliefs/resolve.py +58 -0
  47. apsimo/beliefs/source_claims.py +690 -0
  48. apsimo/beliefs/source_projection.py +883 -0
  49. apsimo/beliefs/source_time.py +208 -0
  50. apsimo/beliefs/store.py +133 -0
  51. apsimo/briefings/aggregators.py +824 -0
  52. apsimo/briefings/composer.py +420 -0
  53. apsimo/briefings/config.py +55 -0
  54. apsimo/briefings/delivery.py +439 -0
  55. apsimo/briefings/engagement.py +97 -0
  56. apsimo/briefings/engine.py +274 -0
  57. apsimo/briefings/enhancer.py +99 -0
  58. apsimo/briefings/models.py +183 -0
  59. apsimo/briefings/scheduler.py +382 -0
  60. apsimo/briefings/store.py +435 -0
  61. apsimo/chain/__init__.py +48 -0
  62. apsimo/chain/block.py +100 -0
  63. apsimo/chain/cli.py +704 -0
  64. apsimo/chain/genesis.py +443 -0
  65. apsimo/chain/identity.py +416 -0
  66. apsimo/chain/keys.py +1025 -0
  67. apsimo/chain/local_keys.py +187 -0
  68. apsimo/chain/manager.py +290 -0
  69. apsimo/chain/node.py +163 -0
  70. apsimo/chain/plugin_transactions.py +371 -0
  71. apsimo/chain/protocol.py +220 -0
  72. apsimo/chain/state_machine.py +676 -0
  73. apsimo/chain/storage.py +503 -0
  74. apsimo/chain/transactions.py +250 -0
  75. apsimo/chain/validation.py +397 -0
  76. apsimo/channels/__init__.py +1 -0
  77. apsimo/channels/manifest.py +31 -0
  78. apsimo/channels/migrations/001_channels_schema.sql +12 -0
  79. apsimo/channels/phone_gateways.py +42 -0
  80. apsimo/channels/presence.py +188 -0
  81. apsimo/channels/router.py +235 -0
  82. apsimo/channels/store.py +231 -0
  83. apsimo/cli.py +2688 -0
  84. apsimo/cognition/__init__.py +11 -0
  85. apsimo/cognition/charter.py +398 -0
  86. apsimo/cognition/drive_governance.py +3530 -0
  87. apsimo/cognition/evidence_pipeline.py +1627 -0
  88. apsimo/cognition/external_events.py +932 -0
  89. apsimo/cognition/goal_spine.py +3488 -0
  90. apsimo/cognition/introspection.py +214 -0
  91. apsimo/cognition/prompt.py +150 -0
  92. apsimo/cognition/runtime.py +108 -0
  93. apsimo/cognition/trigger.py +154 -0
  94. apsimo/commitments/__init__.py +18 -0
  95. apsimo/commitments/local_work.py +355 -0
  96. apsimo/commitments/store.py +1052 -0
  97. apsimo/commitments/work.py +91 -0
  98. apsimo/compat.py +53 -0
  99. apsimo/compression/__init__.py +467 -0
  100. apsimo/connectors/__init__.py +21 -0
  101. apsimo/connectors/base.py +152 -0
  102. apsimo/connectors/caldav_calendar.py +125 -0
  103. apsimo/connectors/fs_documents.py +85 -0
  104. apsimo/connectors/imap_email.py +138 -0
  105. apsimo/connectors/manager.py +218 -0
  106. apsimo/connectors/webhook_pull.py +88 -0
  107. apsimo/contacts/__init__.py +33 -0
  108. apsimo/contacts/comms.py +357 -0
  109. apsimo/contacts/config.py +79 -0
  110. apsimo/contacts/exporters/__init__.py +1 -0
  111. apsimo/contacts/exporters/vcard.py +71 -0
  112. apsimo/contacts/identity_links.py +251 -0
  113. apsimo/contacts/importer.py +280 -0
  114. apsimo/contacts/importers/__init__.py +1 -0
  115. apsimo/contacts/importers/batch.py +43 -0
  116. apsimo/contacts/importers/macos_contacts.py +101 -0
  117. apsimo/contacts/migrations/001_contacts_schema.sql +141 -0
  118. apsimo/contacts/migrations/002_trust_scopes.sql +36 -0
  119. apsimo/contacts/migrations/003_open_gateway_enum.sql +32 -0
  120. apsimo/contacts/migrations/004_contact_provision_operations.sql +18 -0
  121. apsimo/contacts/migrations/005_identity_links.sql +27 -0
  122. apsimo/contacts/models.py +308 -0
  123. apsimo/contacts/scoring.py +16 -0
  124. apsimo/contacts/store.py +1623 -0
  125. apsimo/contacts/transport_ingress.py +252 -0
  126. apsimo/contacts/world_bridge.py +314 -0
  127. apsimo/contextgate/__init__.py +69 -0
  128. apsimo/contextgate/chunker.py +169 -0
  129. apsimo/contextgate/estimate.py +54 -0
  130. apsimo/contextgate/gate.py +313 -0
  131. apsimo/contextgate/retrieve.py +115 -0
  132. apsimo/delivery/__init__.py +16 -0
  133. apsimo/delivery/bridge.py +1260 -0
  134. apsimo/delivery/channels.py +526 -0
  135. apsimo/delivery/classification.py +50 -0
  136. apsimo/delivery/rate_limiter.py +268 -0
  137. apsimo/delivery/reachout_policy.py +206 -0
  138. apsimo/directed/__init__.py +22 -0
  139. apsimo/directed/audit.py +167 -0
  140. apsimo/directed/intake.py +95 -0
  141. apsimo/directed/models.py +191 -0
  142. apsimo/directed/service.py +509 -0
  143. apsimo/directives/__init__.py +25 -0
  144. apsimo/directives/evidence.py +87 -0
  145. apsimo/directives/extractor.py +188 -0
  146. apsimo/directives/guard.py +364 -0
  147. apsimo/directives/models.py +206 -0
  148. apsimo/directives/service.py +372 -0
  149. apsimo/directives/store.py +167 -0
  150. apsimo/doctor.py +2173 -0
  151. apsimo/environment.py +43 -0
  152. apsimo/events/__init__.py +33 -0
  153. apsimo/events/broadcaster.py +98 -0
  154. apsimo/events/bus.py +217 -0
  155. apsimo/events/journal.py +863 -0
  156. apsimo/events/stream.py +131 -0
  157. apsimo/events/types.py +150 -0
  158. apsimo/execution_results.py +357 -0
  159. apsimo/feedback/__init__.py +5 -0
  160. apsimo/feedback/store.py +76 -0
  161. apsimo/feeds/__init__.py +19 -0
  162. apsimo/feeds/cli.py +84 -0
  163. apsimo/feeds/engine.py +437 -0
  164. apsimo/feeds/example-feed.yaml +77 -0
  165. apsimo/feeds/hermes_cron.py +126 -0
  166. apsimo/feeds/manager.py +235 -0
  167. apsimo/feeds/spec.py +250 -0
  168. apsimo/feeds/template.py +202 -0
  169. apsimo/gate/__init__.py +18 -0
  170. apsimo/gate/audit.py +61 -0
  171. apsimo/gate/communication_policy.py +166 -0
  172. apsimo/gate/config.py +72 -0
  173. apsimo/gate/context_provenance.py +170 -0
  174. apsimo/gate/env_risk.py +226 -0
  175. apsimo/gate/guard_audit.py +353 -0
  176. apsimo/gate/layers/__init__.py +1 -0
  177. apsimo/gate/layers/base.py +15 -0
  178. apsimo/gate/layers/l1_recipient.py +66 -0
  179. apsimo/gate/layers/l2_pii.py +134 -0
  180. apsimo/gate/layers/l3_cross_context.py +50 -0
  181. apsimo/gate/layers/l4_trust_tier.py +78 -0
  182. apsimo/gate/layers/l5_injection.py +199 -0
  183. apsimo/gate/layers/l6_review.py +86 -0
  184. apsimo/gate/layers/l7_delay.py +100 -0
  185. apsimo/gate/layers/tom2_epistemic.py +185 -0
  186. apsimo/gate/models.py +64 -0
  187. apsimo/gate/pending_dispatch.py +5 -0
  188. apsimo/gate/pipeline.py +206 -0
  189. apsimo/gate/rejection.py +259 -0
  190. apsimo/gate/response_guard.py +700 -0
  191. apsimo/gate/rulesets/injection_v1.yaml +51 -0
  192. apsimo/gate/surface_policy.py +189 -0
  193. apsimo/gate/taint.py +226 -0
  194. apsimo/genesis.json +9 -0
  195. apsimo/goals/__init__.py +100 -0
  196. apsimo/goals/config.py +38 -0
  197. apsimo/goals/decomposer.py +421 -0
  198. apsimo/goals/engine.py +617 -0
  199. apsimo/goals/inference.py +354 -0
  200. apsimo/goals/models.py +302 -0
  201. apsimo/goals/priority.py +270 -0
  202. apsimo/goals/queue_bridge.py +149 -0
  203. apsimo/goals/replan.py +450 -0
  204. apsimo/goals/schema.sql +89 -0
  205. apsimo/goals/store.py +692 -0
  206. apsimo/governed_actions.py +1708 -0
  207. apsimo/harness_integration/__init__.py +45 -0
  208. apsimo/harness_integration/context.py +41 -0
  209. apsimo/harness_integration/skills.py +231 -0
  210. apsimo/identity/__init__.py +26 -0
  211. apsimo/identity/participants.py +181 -0
  212. apsimo/identity/resolver.py +329 -0
  213. apsimo/identity_bootstrap/__init__.py +5 -0
  214. apsimo/identity_bootstrap/builder.py +208 -0
  215. apsimo/identity_bootstrap/corpus.py +443 -0
  216. apsimo/identity_bootstrap/models.py +54 -0
  217. apsimo/identity_bootstrap/runner.py +353 -0
  218. apsimo/identity_bootstrap/seeders/__init__.py +25 -0
  219. apsimo/identity_bootstrap/seeders/briefings.py +109 -0
  220. apsimo/identity_bootstrap/seeders/chain.py +57 -0
  221. apsimo/identity_bootstrap/seeders/goals.py +128 -0
  222. apsimo/identity_bootstrap/seeders/memory.py +191 -0
  223. apsimo/identity_bootstrap/seeders/neo4j_cognition.py +79 -0
  224. apsimo/identity_bootstrap/seeders/relationship.py +152 -0
  225. apsimo/identity_bootstrap/seeders/sessions.py +67 -0
  226. apsimo/identity_bootstrap/seeders/skills.py +92 -0
  227. apsimo/identity_bootstrap/seeders/task_queue.py +72 -0
  228. apsimo/identity_bootstrap/seeders/world_model.py +143 -0
  229. apsimo/identity_bootstrap/self_query.py +92 -0
  230. apsimo/identity_bootstrap/self_reflection.py +155 -0
  231. apsimo/identity_bootstrap/skill.py +37 -0
  232. apsimo/identity_bootstrap/verifier.py +436 -0
  233. apsimo/initiatives/__init__.py +20 -0
  234. apsimo/initiatives/action_registry.py +454 -0
  235. apsimo/initiatives/approval_authority.py +2105 -0
  236. apsimo/initiatives/approval_policy.py +123 -0
  237. apsimo/initiatives/assignment.py +263 -0
  238. apsimo/initiatives/backup_evidence.py +100 -0
  239. apsimo/initiatives/context_freshness.py +103 -0
  240. apsimo/initiatives/models.py +318 -0
  241. apsimo/initiatives/native_work.py +270 -0
  242. apsimo/initiatives/standing_approvals.py +232 -0
  243. apsimo/initiatives/store.py +1081 -0
  244. apsimo/initiatives/temporal_followup.py +410 -0
  245. apsimo/intelligence/__init__.py +1 -0
  246. apsimo/intelligence/cognition/__init__.py +24 -0
  247. apsimo/intelligence/cognition/gap_detector.py +148 -0
  248. apsimo/intelligence/cognition/metalearner.py +547 -0
  249. apsimo/intelligence/cognition/metrics_collector.py +217 -0
  250. apsimo/intelligence/cognition/performance_index.py +299 -0
  251. apsimo/intelligence/cognition/registry.py +192 -0
  252. apsimo/intelligence/cognition/strategy_adjuster.py +222 -0
  253. apsimo/intelligence/cognition/types.py +16 -0
  254. apsimo/intelligence/components/__init__.py +66 -0
  255. apsimo/intelligence/components/anomaly_detector.py +413 -0
  256. apsimo/intelligence/components/initiative_engine.py +2643 -0
  257. apsimo/intelligence/components/preference_learner.py +521 -0
  258. apsimo/intelligence/components/research_orchestrator.py +358 -0
  259. apsimo/intelligence/components/self_directed_thinker.py +221 -0
  260. apsimo/intelligence/components/self_reflector.py +252 -0
  261. apsimo/intelligence/components/session_continuity.py +154 -0
  262. apsimo/intelligence/components/task_planner.py +320 -0
  263. apsimo/intelligence/components/tool_learner.py +217 -0
  264. apsimo/intelligence/graph/__init__.py +79 -0
  265. apsimo/intelligence/graph/client.py +2483 -0
  266. apsimo/intelligence/graph/consolidator.py +405 -0
  267. apsimo/intelligence/graph/distiller.py +312 -0
  268. apsimo/intelligence/graph/migrations.py +129 -0
  269. apsimo/intelligence/graph/queries.py +248 -0
  270. apsimo/intelligence/graph/recall.py +281 -0
  271. apsimo/intelligence/graph/reconciler.py +144 -0
  272. apsimo/intelligence/graph/schema.py +337 -0
  273. apsimo/intelligence/graph/selection.py +252 -0
  274. apsimo/intelligence/learning/__init__.py +17 -0
  275. apsimo/intelligence/learning/continuous_learner.py +245 -0
  276. apsimo/intelligence/learning/feedback_store.py +321 -0
  277. apsimo/intelligence/mind_model/__init__.py +1 -0
  278. apsimo/intelligence/mind_model/graph_baseline.py +136 -0
  279. apsimo/intelligence/mind_model/signal_collector.py +361 -0
  280. apsimo/intelligence/relationships/__init__.py +11 -0
  281. apsimo/intelligence/relationships/profiler.py +389 -0
  282. apsimo/intelligence/relationships/scorer.py +560 -0
  283. apsimo/intelligence/relationships/signal_floor.py +66 -0
  284. apsimo/intelligence/relationships/trust_tiers.py +300 -0
  285. apsimo/intelligence/synthesis/__init__.py +40 -0
  286. apsimo/intelligence/synthesis/connection_discoverer.py +379 -0
  287. apsimo/intelligence/synthesis/cross_domain_analyzer.py +287 -0
  288. apsimo/intelligence/synthesis/insight_deliverer.py +171 -0
  289. apsimo/intelligence/synthesis/insight_store.py +79 -0
  290. apsimo/intelligence/synthesis/insight_validator.py +183 -0
  291. apsimo/intelligence/synthesis/novelty_scorer.py +267 -0
  292. apsimo/intelligence/turn_middleware/__init__.py +15 -0
  293. apsimo/intelligence/turn_middleware/memory_sync.py +119 -0
  294. apsimo/mcp/__init__.py +41 -0
  295. apsimo/mcp/__main__.py +6 -0
  296. apsimo/mcp/config.py +287 -0
  297. apsimo/mcp/server.py +501 -0
  298. apsimo/migrations.py +187 -0
  299. apsimo/mining/__init__.py +27 -0
  300. apsimo/mining/corpus.py +239 -0
  301. apsimo/mining/escalations.py +289 -0
  302. apsimo/mining/models.py +169 -0
  303. apsimo/mining/store.py +210 -0
  304. apsimo/models/__init__.py +30 -0
  305. apsimo/models/memory.py +80 -0
  306. apsimo/models/mesh.py +72 -0
  307. apsimo/models/person.py +104 -0
  308. apsimo/models/signal.py +108 -0
  309. apsimo/observations/__init__.py +15 -0
  310. apsimo/observations/store.py +277 -0
  311. apsimo/patterns/__init__.py +6 -0
  312. apsimo/patterns/extract.py +187 -0
  313. apsimo/patterns/store.py +227 -0
  314. apsimo/persona/__init__.py +1 -0
  315. apsimo/persona/engine.py +611 -0
  316. apsimo/persona/manifest.py +140 -0
  317. apsimo/projects/__init__.py +28 -0
  318. apsimo/projects/engine.py +1681 -0
  319. apsimo/projects/event_outbox.py +188 -0
  320. apsimo/projects/models.py +216 -0
  321. apsimo/projects/planner.py +181 -0
  322. apsimo/projects/store.py +1446 -0
  323. apsimo/proposals/__init__.py +12 -0
  324. apsimo/proposals/engine.py +114 -0
  325. apsimo/proposals/models.py +207 -0
  326. apsimo/qualification/__init__.py +1 -0
  327. apsimo/qualification/cases.py +75 -0
  328. apsimo/qualification/cli.py +51 -0
  329. apsimo/qualification/memory_cases.py +209 -0
  330. apsimo/qualification/records.py +92 -0
  331. apsimo/qualification/report.py +87 -0
  332. apsimo/qualification/runner.py +311 -0
  333. apsimo/qualification/structured_cases.py +131 -0
  334. apsimo/reasoning/__init__.py +13 -0
  335. apsimo/reasoning/executor.py +506 -0
  336. apsimo/reasoning/loop.py +373 -0
  337. apsimo/reasoning/native_tools/__init__.py +16 -0
  338. apsimo/reasoning/native_tools/calculate.py +141 -0
  339. apsimo/reasoning/native_tools/file_ops.py +150 -0
  340. apsimo/reasoning/native_tools/web_search.py +49 -0
  341. apsimo/reasoning/tool_policy.py +182 -0
  342. apsimo/redact/__init__.py +176 -0
  343. apsimo/repos/__init__.py +5 -0
  344. apsimo/repos/mirrors.py +204 -0
  345. apsimo/research/__init__.py +41 -0
  346. apsimo/research/artifact.py +482 -0
  347. apsimo/research/gatherer.py +387 -0
  348. apsimo/research/pipeline.py +513 -0
  349. apsimo/research/search/__init__.py +7 -0
  350. apsimo/research/search/base.py +41 -0
  351. apsimo/research/search/brave.py +59 -0
  352. apsimo/research/search/cache.py +51 -0
  353. apsimo/research/search/duckduckgo.py +103 -0
  354. apsimo/research/search/orchestrator.py +119 -0
  355. apsimo/research/search/serpapi.py +59 -0
  356. apsimo/research/search/tavily.py +59 -0
  357. apsimo/research/synthesizer.py +309 -0
  358. apsimo/router/__init__.py +30 -0
  359. apsimo/router/complexity_scorer.py +148 -0
  360. apsimo/router/endpoints.py +153 -0
  361. apsimo/router/fallback.py +58 -0
  362. apsimo/router/functions.py +243 -0
  363. apsimo/router/native_policy.py +52 -0
  364. apsimo/router/router.py +762 -0
  365. apsimo/router/self_learning.py +174 -0
  366. apsimo/router/tiers.py +677 -0
  367. apsimo/sandbox/__init__.py +21 -0
  368. apsimo/sandbox/backend.py +195 -0
  369. apsimo/sandbox/manager.py +173 -0
  370. apsimo/scope_bounds.py +7 -0
  371. apsimo/secrets/__init__.py +6 -0
  372. apsimo/secrets/backends/__init__.py +8 -0
  373. apsimo/secrets/backends/base.py +42 -0
  374. apsimo/secrets/backends/env.py +110 -0
  375. apsimo/secrets/backends/keyring.py +72 -0
  376. apsimo/secrets/backends/onepassword.py +232 -0
  377. apsimo/secrets/cli.py +191 -0
  378. apsimo/secrets/manager.py +160 -0
  379. apsimo/secrets/migration.py +101 -0
  380. apsimo/secrets/types.py +98 -0
  381. apsimo/seed.py +41 -0
  382. apsimo/self_model/__init__.py +37 -0
  383. apsimo/self_model/appraisals.py +673 -0
  384. apsimo/self_model/benchmark.py +1314 -0
  385. apsimo/self_model/brief.py +40 -0
  386. apsimo/self_model/event_concerns.py +1128 -0
  387. apsimo/self_model/execution_forecasts.py +353 -0
  388. apsimo/self_model/expectations.py +1595 -0
  389. apsimo/self_model/experiments.py +1150 -0
  390. apsimo/self_model/journal.py +148 -0
  391. apsimo/self_model/judgments.py +705 -0
  392. apsimo/self_model/native_outcomes.py +55 -0
  393. apsimo/self_model/params.py +220 -0
  394. apsimo/self_model/perspective.py +246 -0
  395. apsimo/self_model/reconcile.py +183 -0
  396. apsimo/self_model/reply_forecasts.py +381 -0
  397. apsimo/self_model/runtime_forecasts.py +296 -0
  398. apsimo/self_model/runtime_models.py +67 -0
  399. apsimo/self_model/settlement.py +207 -0
  400. apsimo/self_model/situation.py +1731 -0
  401. apsimo/self_model/store.py +883 -0
  402. apsimo/self_model/supervised.py +137 -0
  403. apsimo/self_model/thinker.py +99 -0
  404. apsimo/self_model/trust.py +388 -0
  405. apsimo/self_model/workspace.py +2388 -0
  406. apsimo/server.py +4197 -0
  407. apsimo/services/__init__.py +1 -0
  408. apsimo/services/agent_bridge.py +474 -0
  409. apsimo/services/initiative_executor.py +914 -0
  410. apsimo/services/instance.py +297 -0
  411. apsimo/sessions/__init__.py +22 -0
  412. apsimo/sessions/config.py +13 -0
  413. apsimo/sessions/context_loader.py +88 -0
  414. apsimo/sessions/federation_session.py +75 -0
  415. apsimo/sessions/isolated_session.py +98 -0
  416. apsimo/sessions/reports.py +84 -0
  417. apsimo/sessions/store.py +148 -0
  418. apsimo/setup.py +2818 -0
  419. apsimo/setup_hermes.py +879 -0
  420. apsimo/setup_local_work.py +218 -0
  421. apsimo/setup_native_goals.py +134 -0
  422. apsimo/setup_native_reviews.py +115 -0
  423. apsimo/skills/__init__.py +10 -0
  424. apsimo/skills/base.py +108 -0
  425. apsimo/skills/budget.py +28 -0
  426. apsimo/skills/executor.py +493 -0
  427. apsimo/skills/executors/__init__.py +1 -0
  428. apsimo/skills/executors/behavioral_correction.py +75 -0
  429. apsimo/skills/executors/capability_gap.py +38 -0
  430. apsimo/skills/executors/data_quality.py +163 -0
  431. apsimo/skills/executors/knowledge_acquisition.py +41 -0
  432. apsimo/skills/executors/operational_hygiene.py +185 -0
  433. apsimo/skills/executors/subsystem_health.py +169 -0
  434. apsimo/skills/hermes_export.py +431 -0
  435. apsimo/skills/index.py +123 -0
  436. apsimo/skills/learning/__init__.py +21 -0
  437. apsimo/skills/learning/novelty_detector.py +206 -0
  438. apsimo/skills/learning/pattern_extractor.py +199 -0
  439. apsimo/skills/learning/triggers.py +159 -0
  440. apsimo/skills/loader.py +246 -0
  441. apsimo/skills/migrations/002_progressive_loading.sql +6 -0
  442. apsimo/skills/migrations/backfill_triggers.py +20 -0
  443. apsimo/skills/models.py +202 -0
  444. apsimo/skills/packager.py +128 -0
  445. apsimo/skills/protocols.py +70 -0
  446. apsimo/skills/registry.py +191 -0
  447. apsimo/skills/runtime.py +58 -0
  448. apsimo/skills/sandbox_runner.py +229 -0
  449. apsimo/skills/scheduler.py +129 -0
  450. apsimo/skills/schema.py +79 -0
  451. apsimo/skills/security/__init__.py +12 -0
  452. apsimo/skills/security/guards.py +53 -0
  453. apsimo/skills/security/scanner.py +223 -0
  454. apsimo/skills_memory/__init__.py +26 -0
  455. apsimo/skills_memory/distill.py +159 -0
  456. apsimo/skills_memory/models.py +85 -0
  457. apsimo/skills_memory/retrieve.py +62 -0
  458. apsimo/skills_memory/store.py +172 -0
  459. apsimo/surprise/__init__.py +6 -0
  460. apsimo/surprise/accumulation.py +57 -0
  461. apsimo/surprise/scorer.py +102 -0
  462. apsimo/surprise/store.py +203 -0
  463. apsimo/task_queue/__init__.py +69 -0
  464. apsimo/task_queue/action_receipts.py +148 -0
  465. apsimo/task_queue/approval_relay_canary.py +108 -0
  466. apsimo/task_queue/config.py +85 -0
  467. apsimo/task_queue/contract.py +361 -0
  468. apsimo/task_queue/events.py +130 -0
  469. apsimo/task_queue/governor.py +1031 -0
  470. apsimo/task_queue/handlers/__init__.py +16 -0
  471. apsimo/task_queue/handlers/base.py +37 -0
  472. apsimo/task_queue/handlers/inference.py +640 -0
  473. apsimo/task_queue/handlers/monitoring.py +116 -0
  474. apsimo/task_queue/handlers/registry.py +75 -0
  475. apsimo/task_queue/handlers/subtask_handler.py +173 -0
  476. apsimo/task_queue/handlers/system_maintenance.py +147 -0
  477. apsimo/task_queue/mesh_integration.py +111 -0
  478. apsimo/task_queue/models.py +317 -0
  479. apsimo/task_queue/queue_manager.py +8286 -0
  480. apsimo/task_queue/routing.py +287 -0
  481. apsimo/task_queue/scheduler.py +252 -0
  482. apsimo/task_queue/schema.sql +197 -0
  483. apsimo/task_queue/work_control.py +342 -0
  484. apsimo/task_queue/worker.py +993 -0
  485. apsimo/telemetry.py +145 -0
  486. apsimo/tom/__init__.py +6 -0
  487. apsimo/tom/affect.py +387 -0
  488. apsimo/tom/approvals.py +171 -0
  489. apsimo/tom/arcs.py +896 -0
  490. apsimo/tom/asymmetry.py +131 -0
  491. apsimo/tom/eligibility.py +248 -0
  492. apsimo/tom/engagement.py +214 -0
  493. apsimo/tom/exposure.py +214 -0
  494. apsimo/tom/extractor.py +306 -0
  495. apsimo/tom/fact_adapters.py +144 -0
  496. apsimo/tom/facts.py +326 -0
  497. apsimo/tom/integration.py +592 -0
  498. apsimo/tom/leveled.py +118 -0
  499. apsimo/tom/levels.py +247 -0
  500. apsimo/tom/recipient_audit.py +995 -0
  501. apsimo/tom/recipient_simulator.py +593 -0
  502. apsimo/tom/source_lineage.py +93 -0
  503. apsimo/tom/tom2.py +277 -0
  504. apsimo/tom/visibility.py +559 -0
  505. apsimo/tom/visibility_store.py +414 -0
  506. apsimo/tools/__init__.py +0 -0
  507. apsimo/tools/definitions.py +740 -0
  508. apsimo/tools/handlers.py +943 -0
  509. apsimo/toolsmith/__init__.py +26 -0
  510. apsimo/toolsmith/authority.py +166 -0
  511. apsimo/toolsmith/engine.py +559 -0
  512. apsimo/toolsmith/integrity.py +100 -0
  513. apsimo/toolsmith/miner.py +145 -0
  514. apsimo/toolsmith/policy.py +110 -0
  515. apsimo/toolsmith/registry.py +635 -0
  516. apsimo/turns/__init__.py +17 -0
  517. apsimo/turns/audio.py +134 -0
  518. apsimo/turns/documents.py +235 -0
  519. apsimo/turns/executions.py +486 -0
  520. apsimo/turns/hermes_history.py +245 -0
  521. apsimo/turns/hermes_kanban.py +268 -0
  522. apsimo/turns/hermes_work.py +96 -0
  523. apsimo/turns/idempotency.py +752 -0
  524. apsimo/turns/local_work.py +115 -0
  525. apsimo/turns/media.py +581 -0
  526. apsimo/turns/reported_workers.py +196 -0
  527. apsimo/turns/source_annotations.py +283 -0
  528. apsimo/turns/source_attribution.py +154 -0
  529. apsimo/turns/source_read.py +351 -0
  530. apsimo/turns/source_vectors.py +263 -0
  531. apsimo/turns/video.py +210 -0
  532. apsimo/util/autonomy_preset.py +220 -0
  533. apsimo/util/instance.py +92 -0
  534. apsimo/util/model_output.py +25 -0
  535. apsimo/util/quiet_hours.py +27 -0
  536. apsimo/util/session_safety.py +37 -0
  537. apsimo/util/temporal.py +343 -0
  538. apsimo/vector/__init__.py +75 -0
  539. apsimo/vector/backfill.py +171 -0
  540. apsimo/vector/caption.py +114 -0
  541. apsimo/vector/collections.py +51 -0
  542. apsimo/vector/config.py +102 -0
  543. apsimo/vector/embedder.py +670 -0
  544. apsimo/vector/image_preprocess.py +406 -0
  545. apsimo/vector/image_store.py +296 -0
  546. apsimo/vector/indexes.py +162 -0
  547. apsimo/vector/migrate.py +334 -0
  548. apsimo/vector/multimodal_provider.py +417 -0
  549. apsimo/vector/multimodal_types.py +87 -0
  550. apsimo/vector/openai_provider.py +119 -0
  551. apsimo/vector/query.py +49 -0
  552. apsimo/vector/reranker.py +565 -0
  553. apsimo/vector/safety_image.py +159 -0
  554. apsimo/vector/scanner.py +197 -0
  555. apsimo/vector/setup.py +289 -0
  556. apsimo/vector/store.py +533 -0
  557. apsimo/vector/tiers.py +263 -0
  558. apsimo/work_orders.py +925 -0
  559. apsimo/workers/__init__.py +21 -0
  560. apsimo/workers/agent_bridge.py +640 -0
  561. apsimo/workers/colony_worker.py +382 -0
  562. apsimo/workers/queue_worker.py +441 -0
  563. apsimo/workers/skills_sync.py +152 -0
  564. apsimo/world_model/__init__.py +71 -0
  565. apsimo/world_model/causal_maintenance.py +131 -0
  566. apsimo/world_model/causal_policy.py +43 -0
  567. apsimo/world_model/causal_query.py +125 -0
  568. apsimo/world_model/confidence.py +54 -0
  569. apsimo/world_model/config.py +64 -0
  570. apsimo/world_model/constants.py +97 -0
  571. apsimo/world_model/entities.py +145 -0
  572. apsimo/world_model/expectation_resolvers.py +177 -0
  573. apsimo/world_model/extraction/__init__.py +7 -0
  574. apsimo/world_model/extraction/base.py +62 -0
  575. apsimo/world_model/extraction/conversation_extractor.py +262 -0
  576. apsimo/world_model/extraction/detector.py +74 -0
  577. apsimo/world_model/extraction/document_extractor.py +78 -0
  578. apsimo/world_model/extraction/formats/__init__.py +24 -0
  579. apsimo/world_model/extraction/formats/csv_fmt.py +68 -0
  580. apsimo/world_model/extraction/formats/html_fmt.py +72 -0
  581. apsimo/world_model/extraction/formats/json_fmt.py +68 -0
  582. apsimo/world_model/extraction/formats/pdf.py +43 -0
  583. apsimo/world_model/extraction/formats/text.py +27 -0
  584. apsimo/world_model/extraction/llm_extractor.py +164 -0
  585. apsimo/world_model/extraction/pipeline.py +73 -0
  586. apsimo/world_model/integrations/__init__.py +5 -0
  587. apsimo/world_model/integrations/mind_model_bridge.py +115 -0
  588. apsimo/world_model/integrations/social_intel_bridge.py +120 -0
  589. apsimo/world_model/jobs/__init__.py +4 -0
  590. apsimo/world_model/jobs/extraction_job.py +168 -0
  591. apsimo/world_model/llm_extract.py +572 -0
  592. apsimo/world_model/neo4j/__init__.py +5 -0
  593. apsimo/world_model/neo4j/backend.py +654 -0
  594. apsimo/world_model/observations.py +155 -0
  595. apsimo/world_model/populator.py +307 -0
  596. apsimo/world_model/postgres/__init__.py +1 -0
  597. apsimo/world_model/postgres/backend.py +683 -0
  598. apsimo/world_model/relationships.py +25 -0
  599. apsimo/world_model/resolution/__init__.py +13 -0
  600. apsimo/world_model/resolution/entity_resolver.py +232 -0
  601. apsimo/world_model/resolution/merge_audit.py +16 -0
  602. apsimo/world_model/resolution/merge_workflow.py +117 -0
  603. apsimo/world_model/source_reports.py +121 -0
  604. apsimo/world_model/sqlite/__init__.py +4 -0
  605. apsimo/world_model/sqlite/backend.py +855 -0
  606. apsimo/world_model/sqlite/schema.sql +132 -0
  607. apsimo/world_model/store.py +545 -0
  608. apsimo-1.3.0.dist-info/METADATA +78 -0
  609. apsimo-1.3.0.dist-info/RECORD +614 -0
  610. apsimo-1.3.0.dist-info/WHEEL +5 -0
  611. apsimo-1.3.0.dist-info/entry_points.txt +11 -0
  612. apsimo-1.3.0.dist-info/licenses/LICENSE +21 -0
  613. apsimo-1.3.0.dist-info/top_level.txt +2 -0
  614. 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
+ ]