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,191 @@
1
+ """Memory seeder — writes foundational memories to Neo4j graph + LanceDB.
2
+
3
+ Uses ColonyGraph.store_memory() which persists to Neo4j and indexes in
4
+ LanceDB when configured. Falls back to the API router in-memory dict
5
+ only when the graph is unavailable (e.g. Neo4j offline).
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ import logging
12
+ from datetime import datetime, timezone
13
+ from typing import Any, Optional
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ def _now_iso() -> str:
19
+ return datetime.now(timezone.utc).isoformat()
20
+
21
+
22
+ class MemorySeeder:
23
+ name = "memory"
24
+
25
+ def __init__(self, colony_graph: Optional[Any] = None) -> None:
26
+ self._graph = colony_graph
27
+
28
+ async def seed(self, corpus: Any) -> None:
29
+ colony_id = corpus.colony_id
30
+ now = _now_iso()
31
+
32
+ memories = [
33
+ {
34
+ "id": f"mem-bootstrap-identity-{colony_id[:8]}",
35
+ "type": "episodic",
36
+ "content": (
37
+ f"I am {corpus.colony_name}, a Colony AI agent instance with ID {colony_id}. "
38
+ f"I run Colony v{corpus.colony_version} on network {corpus.network_id}. "
39
+ "I was bootstrapped with full self-knowledge at first boot."
40
+ ),
41
+ "tags": ["self", "identity", "bootstrap", "core"],
42
+ "source": "identity_bootstrap",
43
+ "entities": [corpus.colony_name, "Colony"],
44
+ "metadata": {
45
+ "bootstrap_id": f"mem-bootstrap-identity-{colony_id[:8]}",
46
+ "colony_id": colony_id,
47
+ "colony_name": corpus.colony_name,
48
+ "colony_version": corpus.colony_version,
49
+ "network_id": corpus.network_id,
50
+ "corpus_version": corpus.corpus_version,
51
+ "tags": ["self", "identity", "bootstrap", "core"],
52
+ "source": "identity_bootstrap",
53
+ "created_at": now,
54
+ },
55
+ "importance": 0.95,
56
+ },
57
+ {
58
+ "id": f"mem-bootstrap-architecture-{colony_id[:8]}",
59
+ "type": "semantic",
60
+ "content": (
61
+ "Colony has 10 architectural layers: Gateway, API, Intelligence, Memory, "
62
+ "Goals, Skills, TaskQueue, Federation, Safety, and Inference. "
63
+ "Each layer is independently optional and fails gracefully."
64
+ ),
65
+ "tags": ["architecture", "bootstrap", "core"],
66
+ "source": "identity_bootstrap",
67
+ "entities": ["Colony"] + [l.name for l in corpus.layers],
68
+ "metadata": {
69
+ "bootstrap_id": f"mem-bootstrap-architecture-{colony_id[:8]}",
70
+ "layer_count": len(corpus.layers),
71
+ "layers": [l.name for l in corpus.layers],
72
+ "tags": ["architecture", "bootstrap", "core"],
73
+ "source": "identity_bootstrap",
74
+ "created_at": now,
75
+ },
76
+ "importance": 0.85,
77
+ },
78
+ {
79
+ "id": f"mem-bootstrap-safety-{colony_id[:8]}",
80
+ "type": "semantic",
81
+ "content": (
82
+ "The ResponseGate pipeline has 7 layers: L1 RecipientAllowlist, L2 PIIScrubber, "
83
+ "L3 CrossContextGuard, L4 TrustTierGate, L5 InjectionDetector, "
84
+ "L6 HumanReview, L7 SendDelay. All outbound content passes through this pipeline."
85
+ ),
86
+ "tags": ["safety", "gate", "bootstrap"],
87
+ "source": "identity_bootstrap",
88
+ "entities": ["ResponseGate", "Colony"],
89
+ "metadata": {
90
+ "bootstrap_id": f"mem-bootstrap-safety-{colony_id[:8]}",
91
+ "gate_layer_count": len(corpus.gate_layers),
92
+ "tags": ["safety", "gate", "bootstrap"],
93
+ "source": "identity_bootstrap",
94
+ "created_at": now,
95
+ },
96
+ "importance": 0.90,
97
+ },
98
+ {
99
+ "id": f"mem-bootstrap-cognition-{colony_id[:8]}",
100
+ "type": "semantic",
101
+ "content": (
102
+ "Colony's cognition pipeline runs 8 phases: MetaLearning, StrategyAdjustment, "
103
+ "SelfReflection, SessionContinuity, ToolLearning, PreferenceLearning, "
104
+ "TaskPlanning, and ResearchOrchestration."
105
+ ),
106
+ "tags": ["cognition", "intelligence", "bootstrap"],
107
+ "source": "identity_bootstrap",
108
+ "entities": ["Colony", "CognitionPipeline"],
109
+ "metadata": {
110
+ "bootstrap_id": f"mem-bootstrap-cognition-{colony_id[:8]}",
111
+ "phase_count": len(corpus.cognition_phases),
112
+ "phases": [p.name for p in corpus.cognition_phases],
113
+ "tags": ["cognition", "intelligence", "bootstrap"],
114
+ "source": "identity_bootstrap",
115
+ "created_at": now,
116
+ },
117
+ "importance": 0.80,
118
+ },
119
+ ]
120
+
121
+ stored_count = 0
122
+
123
+ # Primary path: write to Neo4j graph (+ LanceDB via store_memory)
124
+ if self._graph is not None:
125
+ for mem in memories:
126
+ try:
127
+ # Check if this bootstrap memory already exists in the graph
128
+ exists = await self._memory_exists_in_graph(mem["id"])
129
+ if exists:
130
+ logger.debug("memory: %s already in graph — skipping", mem["id"])
131
+ stored_count += 1
132
+ continue
133
+
134
+ memory_id = await self._graph.store_memory(
135
+ content=mem["content"],
136
+ memory_type=mem["type"],
137
+ entities=mem.get("entities", []),
138
+ metadata=mem["metadata"],
139
+ importance=mem["importance"],
140
+ )
141
+ logger.debug(
142
+ "memory: stored %s as graph node %s", mem["id"], memory_id
143
+ )
144
+ stored_count += 1
145
+ except Exception as exc:
146
+ logger.warning("memory: failed to store %s in graph: %s", mem["id"], exc)
147
+ else:
148
+ # Fallback: write to API router in-memory dict (non-persistent)
149
+ logger.warning(
150
+ "memory: no colony_graph available — falling back to ephemeral API dict"
151
+ )
152
+ try:
153
+ import colony.api.routers.memory as memory_mod
154
+ api_store = getattr(memory_mod, "_store", None)
155
+ if api_store is not None:
156
+ for mem in memories:
157
+ mem_id = mem["id"]
158
+ if mem_id not in api_store:
159
+ api_store[mem_id] = {
160
+ "id": mem_id,
161
+ "content": mem["content"],
162
+ "type": mem["type"],
163
+ "tags": mem["tags"],
164
+ "source": mem["source"],
165
+ "metadata": mem["metadata"],
166
+ "strength": 1.0,
167
+ "importance": mem["importance"],
168
+ "decay_factor": 1.0,
169
+ "created_at": now,
170
+ "person_id": None,
171
+ }
172
+ stored_count += 1
173
+ except ImportError:
174
+ logger.debug("memory: API router not importable — skipping fallback")
175
+
176
+ logger.info("memory: seeded %d foundational memories", stored_count)
177
+
178
+ async def _memory_exists_in_graph(self, bootstrap_id: str) -> bool:
179
+ """Check if a bootstrap memory already exists by searching for its source tag."""
180
+ try:
181
+ async with self._graph.driver.session(
182
+ database=self._graph.database
183
+ ) as session:
184
+ result = await session.run(
185
+ "MATCH (m:Memory) WHERE m.metadata CONTAINS $tag RETURN count(m) > 0 AS exists",
186
+ tag=bootstrap_id,
187
+ )
188
+ record = await result.single()
189
+ return record is not None and record["exists"]
190
+ except Exception:
191
+ return False
@@ -0,0 +1,79 @@
1
+ """Neo4j cognition seeder — writes bootstrap metrics and a BootstrapEvent node to Neo4j."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from datetime import datetime, timezone
7
+ from typing import Any, Optional
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class Neo4jCognitionSeeder:
13
+ name = "neo4j_cognition"
14
+
15
+ def __init__(
16
+ self,
17
+ colony_graph: Optional[Any] = None,
18
+ metrics_collector: Optional[Any] = None,
19
+ ) -> None:
20
+ self._graph = colony_graph
21
+ self._metrics = metrics_collector
22
+
23
+ async def seed(self, corpus: Any) -> None:
24
+ colony_id = corpus.colony_id
25
+ now_iso = datetime.now(timezone.utc).isoformat()
26
+
27
+ # Record bootstrap metrics
28
+ if self._metrics is not None:
29
+ try:
30
+ await self._metrics.record(
31
+ metric_type="bootstrap_layer_count",
32
+ value=float(len(corpus.layers)),
33
+ domain="identity",
34
+ context={"colony_id": colony_id},
35
+ )
36
+ await self._metrics.record(
37
+ metric_type="bootstrap_endpoint_count",
38
+ value=float(len(corpus.api_endpoints)),
39
+ domain="identity",
40
+ context={"colony_id": colony_id},
41
+ )
42
+ await self._metrics.record(
43
+ metric_type="bootstrap_gate_layers",
44
+ value=float(len(corpus.gate_layers)),
45
+ domain="safety",
46
+ context={"colony_id": colony_id},
47
+ )
48
+ logger.info("neo4j_cognition: bootstrap metrics recorded")
49
+ except Exception as exc:
50
+ logger.warning("neo4j_cognition: metrics recording failed: %s", exc)
51
+
52
+ # Write BootstrapEvent node to Neo4j
53
+ if self._graph is not None:
54
+ cypher = """
55
+ MERGE (b:BootstrapEvent {colony_id: $colony_id})
56
+ SET b.colony_name = $colony_name,
57
+ b.colony_version = $colony_version,
58
+ b.network_id = $network_id,
59
+ b.corpus_version = $corpus_version,
60
+ b.bootstrapped_at = $bootstrapped_at,
61
+ b.layer_count = $layer_count,
62
+ b.endpoint_count = $endpoint_count
63
+ RETURN b.colony_id
64
+ """
65
+ params = {
66
+ "colony_id": colony_id,
67
+ "colony_name": corpus.colony_name,
68
+ "colony_version": corpus.colony_version,
69
+ "network_id": corpus.network_id,
70
+ "corpus_version": corpus.corpus_version,
71
+ "bootstrapped_at": now_iso,
72
+ "layer_count": len(corpus.layers),
73
+ "endpoint_count": len(corpus.api_endpoints),
74
+ }
75
+ try:
76
+ await self._graph.run_query(cypher, params)
77
+ logger.info("neo4j_cognition: BootstrapEvent node upserted for colony_id=%s", colony_id)
78
+ except Exception as exc:
79
+ logger.warning("neo4j_cognition: run_query failed: %s", exc)
@@ -0,0 +1,152 @@
1
+ """Relationship / contacts seeder — creates self-contact in the contacts store."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import logging
7
+ import time
8
+ import secrets
9
+ from datetime import datetime, timezone
10
+ from typing import Any
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ def _now_iso() -> str:
16
+ return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
17
+
18
+
19
+ def _hdl_id() -> str:
20
+ ts = int(time.time() * 1000)
21
+ rand = secrets.token_hex(4)
22
+ return f"hdl-{ts}-{rand}"
23
+
24
+
25
+ class RelationshipSeeder:
26
+ name = "contacts"
27
+
28
+ async def seed(self, corpus: Any) -> None:
29
+ """Seed the self-contact into the contacts store."""
30
+ colony_id = corpus.colony_id
31
+ contact_id = f"self:{colony_id}"
32
+ now = _now_iso()
33
+
34
+ try:
35
+ import colony.api.routers.contacts as contacts_mod
36
+ except ImportError:
37
+ logger.debug("contacts: router not importable — skipping")
38
+ return
39
+
40
+ store = getattr(contacts_mod, "_contact_store", None)
41
+
42
+ if store is not None:
43
+ await self._seed_sqlite(store, contact_id, corpus, now)
44
+ else:
45
+ self._seed_memory(contacts_mod, contact_id, corpus, now)
46
+
47
+ async def _seed_sqlite(self, store: Any, contact_id: str, corpus: Any, now: str) -> None:
48
+ """Upsert self-contact via the store's aiosqlite connection."""
49
+ db = getattr(store, "_db", None)
50
+ if db is None:
51
+ logger.debug("contacts: store._db is None — falling back to memory")
52
+ return
53
+
54
+ colony_id = corpus.colony_id
55
+ tags_json = json.dumps(["self", "system", "colony"])
56
+
57
+ try:
58
+ # Use aiosqlite's async execute
59
+ await db.execute(
60
+ """
61
+ INSERT INTO contacts
62
+ (contact_id, display_name, given_name, family_name, organization,
63
+ relationship_score, trust_tier, interaction_allowed,
64
+ tags_json, privacy_level, person_node_id, notes, import_source,
65
+ first_seen_at, last_interaction_at, interaction_count,
66
+ enrichment_source, enrichment_last_at, deleted_at,
67
+ created_at, updated_at)
68
+ VALUES
69
+ (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
70
+ ON CONFLICT(contact_id) DO UPDATE SET
71
+ updated_at = excluded.updated_at,
72
+ trust_tier = excluded.trust_tier
73
+ """,
74
+ (
75
+ contact_id,
76
+ corpus.colony_name,
77
+ "Colony",
78
+ "Self",
79
+ "Colony AI",
80
+ 1.0,
81
+ "inner_circle",
82
+ 1,
83
+ tags_json,
84
+ "private",
85
+ f"colony-self-{colony_id}",
86
+ "Auto-seeded by identity bootstrap",
87
+ "identity_bootstrap",
88
+ now,
89
+ now,
90
+ 0,
91
+ json.dumps(["identity_bootstrap"]),
92
+ now,
93
+ None,
94
+ now,
95
+ now,
96
+ ),
97
+ )
98
+ await db.commit()
99
+ except Exception as exc:
100
+ logger.warning("contacts: sqlite upsert failed: %s", exc)
101
+ return
102
+
103
+ # Add internal handle
104
+ hdl_id = f"hdl-self-{colony_id[:8]}"
105
+ try:
106
+ await db.execute(
107
+ """
108
+ INSERT INTO contact_handles
109
+ (handle_id, contact_id, gateway, address,
110
+ is_primary, verified, confidence, source, created_at)
111
+ VALUES (?,?,?,?,?,?,?,?,?)
112
+ ON CONFLICT(handle_id) DO NOTHING
113
+ """,
114
+ (hdl_id, contact_id, "custom", f"colony://{colony_id}", 1, 1, 1.0, "identity_bootstrap", now),
115
+ )
116
+ await db.commit()
117
+ except Exception as exc:
118
+ logger.debug("contacts: handle upsert failed: %s", exc)
119
+
120
+ logger.info("contacts: self-contact seeded (contact_id=%s)", contact_id)
121
+
122
+ def _seed_memory(self, contacts_mod: Any, contact_id: str, corpus: Any, now: str) -> None:
123
+ """Fallback: write to the in-memory _store dict."""
124
+ in_mem = getattr(contacts_mod, "_store", None)
125
+ if in_mem is None:
126
+ logger.debug("contacts: no _store fallback available")
127
+ return
128
+
129
+ in_mem[contact_id] = {
130
+ "contact_id": contact_id,
131
+ "display_name": corpus.colony_name,
132
+ "given_name": "Colony",
133
+ "family_name": "Self",
134
+ "organization": "Colony AI",
135
+ "relationship_score": 1.0,
136
+ "trust_tier": "inner_circle",
137
+ "interaction_allowed": True,
138
+ "tags": ["self", "system", "colony"],
139
+ "privacy_level": "private",
140
+ "person_node_id": f"colony-self-{corpus.colony_id}",
141
+ "notes": "Auto-seeded by identity bootstrap",
142
+ "import_source": "identity_bootstrap",
143
+ "first_seen_at": now,
144
+ "last_interaction_at": now,
145
+ "interaction_count": 0,
146
+ "enrichment_source": ["identity_bootstrap"],
147
+ "enrichment_last_at": now,
148
+ "deleted_at": None,
149
+ "created_at": now,
150
+ "updated_at": now,
151
+ }
152
+ logger.info("contacts: self-contact seeded (in-memory, contact_id=%s)", contact_id)
@@ -0,0 +1,67 @@
1
+ """Sessions seeder — records the bootstrap system session."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import time
7
+ from datetime import datetime, timezone
8
+ from typing import Any
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ def _now_iso() -> str:
14
+ return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
15
+
16
+
17
+ class SessionsSeeder:
18
+ name = "sessions"
19
+
20
+ async def seed(self, corpus: Any) -> None:
21
+ colony_id = corpus.colony_id
22
+ contact_id = f"self:{colony_id}"
23
+ session_id = f"sess-bootstrap-{colony_id[:8]}"
24
+ now = _now_iso()
25
+ # 1 year expiry for bootstrap session
26
+ expires_at_ts = time.time() + 86400 * 365
27
+
28
+ try:
29
+ import colony.api.routers.sessions as sessions_mod
30
+ except ImportError:
31
+ logger.debug("sessions: router not importable — skipping")
32
+ return
33
+
34
+ db_backend = getattr(sessions_mod, "_db_backend", None)
35
+
36
+ if db_backend is not None:
37
+ sess_dict = {
38
+ "session_id": session_id,
39
+ "contact_id": contact_id,
40
+ "gateway": "system",
41
+ "trust_tier": "inner_circle",
42
+ "status": "active",
43
+ "created_at": now,
44
+ "closed_at": None,
45
+ "expires_at_ts": expires_at_ts,
46
+ }
47
+ try:
48
+ db_backend.save(sess_dict)
49
+ logger.info("sessions: bootstrap session saved (id=%s)", session_id)
50
+ return
51
+ except Exception as exc:
52
+ logger.warning("sessions: db_backend.save failed: %s", exc)
53
+
54
+ # Fallback: in-memory store
55
+ in_mem = getattr(sessions_mod, "_store", None)
56
+ if in_mem is not None:
57
+ in_mem[session_id] = {
58
+ "session_id": session_id,
59
+ "contact_id": contact_id,
60
+ "gateway": "system",
61
+ "trust_tier": "inner_circle",
62
+ "status": "active",
63
+ "created_at": now,
64
+ "closed_at": None,
65
+ "expires_at_ts": expires_at_ts,
66
+ }
67
+ logger.info("sessions: bootstrap session saved in-memory (id=%s)", session_id)
@@ -0,0 +1,92 @@
1
+ """Skills seeder — registers the bootstrap_self_check skill in the skill registry."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from datetime import datetime, timezone
7
+ from typing import Any, Optional
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class SkillsSeeder:
13
+ name = "skills"
14
+
15
+ def __init__(self, skill_registry: Optional[Any] = None) -> None:
16
+ self._registry = skill_registry
17
+
18
+ async def seed(self, corpus: Any) -> None:
19
+ registry = self._registry
20
+ if registry is None:
21
+ logger.debug("skills: no registry — skipping")
22
+ return
23
+
24
+ try:
25
+ from apsimo.skills.models import (
26
+ SkillManifest,
27
+ SkillStatus,
28
+ SkillPermissions,
29
+ SkillCapability,
30
+ )
31
+ except ImportError as exc:
32
+ logger.debug("skills: import failed — skipping: %s", exc)
33
+ return
34
+
35
+ colony_id = corpus.colony_id
36
+ skill_id = "bootstrap-self-check"
37
+ now = datetime.now(timezone.utc)
38
+
39
+ # Check idempotency
40
+ try:
41
+ existing = await registry.get(skill_id)
42
+ if existing is not None:
43
+ logger.debug("skills: bootstrap_self_check already registered — skipping")
44
+ return
45
+ except Exception:
46
+ pass
47
+
48
+ manifest = SkillManifest(
49
+ skill_id=skill_id,
50
+ name="bootstrap_self_check",
51
+ version="1.0.0",
52
+ description=(
53
+ "Runs the Colony Identity Bootstrap self-check matrix (16 checks). "
54
+ "Returns a verification report showing which systems are healthy."
55
+ ),
56
+ author_colony_id=colony_id,
57
+ created_at=now,
58
+ updated_at=now,
59
+ status=SkillStatus.ACTIVE,
60
+ entry_point="colony.identity_bootstrap.skill:run",
61
+ permissions=SkillPermissions(
62
+ capabilities=[SkillCapability.FILESYSTEM_READ],
63
+ max_duration_secs=30,
64
+ max_memory_mb=64,
65
+ ),
66
+ tags=["system", "bootstrap", "self-check", "health"],
67
+ dependencies=[],
68
+ input_schema={
69
+ "type": "object",
70
+ "properties": {
71
+ "colony_id": {"type": "string"},
72
+ "mode": {"type": "string", "enum": ["full", "quick"], "default": "full"},
73
+ },
74
+ },
75
+ output_schema={
76
+ "type": "object",
77
+ "properties": {
78
+ "verified_systems": {"type": "array", "items": {"type": "string"}},
79
+ "failed_systems": {"type": "array", "items": {"type": "string"}},
80
+ "anomalies": {"type": "array"},
81
+ "success": {"type": "boolean"},
82
+ },
83
+ },
84
+ checksum_sha256="bootstrap-internal",
85
+ trust_score=1.0,
86
+ )
87
+
88
+ try:
89
+ await registry.register(manifest, skill_dir=None)
90
+ logger.info("skills: bootstrap_self_check skill registered")
91
+ except Exception as exc:
92
+ logger.warning("skills: registry.register failed: %s", exc)
@@ -0,0 +1,72 @@
1
+ """Task queue seeder — registers bootstrap worker capabilities and posts a self-check job."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from datetime import datetime, timezone
7
+ from typing import Any, Optional
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class TaskQueueSeeder:
13
+ name = "task_queue"
14
+
15
+ def __init__(self, queue_manager: Optional[Any] = None) -> None:
16
+ self._queue_manager = queue_manager
17
+
18
+ async def seed(self, corpus: Any) -> None:
19
+ queue = self._queue_manager
20
+ if queue is None:
21
+ logger.debug("task_queue: no queue_manager — skipping")
22
+ return
23
+
24
+ try:
25
+ from apsimo.task_queue.models import (
26
+ Job,
27
+ JobType,
28
+ JobPriority,
29
+ WorkerCapabilities,
30
+ )
31
+ except ImportError as exc:
32
+ logger.debug("task_queue: import failed — skipping: %s", exc)
33
+ return
34
+
35
+ colony_id = corpus.colony_id
36
+
37
+ # Register bootstrap worker capabilities
38
+ caps = WorkerCapabilities(
39
+ node_id=f"bootstrap-{colony_id[:8]}",
40
+ capabilities={"bootstrap", "self_check", "identity"},
41
+ capacity={"cpu": 1.0},
42
+ max_concurrent=1,
43
+ job_types={JobType.SYSTEM_MAINTENANCE, JobType.MONITORING},
44
+ available=True,
45
+ load=0.0,
46
+ registered_at=datetime.now(timezone.utc),
47
+ )
48
+ try:
49
+ await queue.register_worker(caps)
50
+ except Exception as exc:
51
+ logger.debug("task_queue: register_worker failed: %s", exc)
52
+
53
+ # Post the initial self-check job
54
+ job_id = f"job-bootstrap-selfcheck-{colony_id[:8]}"
55
+ job = Job(
56
+ job_id=job_id,
57
+ job_type=JobType.SYSTEM_MAINTENANCE,
58
+ payload={
59
+ "action": "identity_self_check",
60
+ "colony_id": colony_id,
61
+ "corpus_version": corpus.corpus_version,
62
+ "triggered_by": "identity_bootstrap",
63
+ },
64
+ priority=JobPriority.LOW,
65
+ posted_by=f"bootstrap-{colony_id[:8]}",
66
+ tags={"type": "bootstrap", "colony_id": colony_id[:8]},
67
+ )
68
+ try:
69
+ await queue.post(job)
70
+ logger.info("task_queue: self-check job posted (id=%s)", job_id)
71
+ except Exception as exc:
72
+ logger.debug("task_queue: post job failed: %s", exc)