abstractframework 0.9.0__tar.gz → 0.9.1__tar.gz

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 (199) hide show
  1. {abstractframework-0.9.0 → abstractframework-0.9.1}/CHANGELOG.md +22 -0
  2. {abstractframework-0.9.0/abstractframework.egg-info → abstractframework-0.9.1}/PKG-INFO +7 -7
  3. {abstractframework-0.9.0 → abstractframework-0.9.1}/README.md +3 -3
  4. {abstractframework-0.9.0 → abstractframework-0.9.1}/abstractframework/__init__.py +2 -2
  5. {abstractframework-0.9.0 → abstractframework-0.9.1/abstractframework.egg-info}/PKG-INFO +7 -7
  6. {abstractframework-0.9.0 → abstractframework-0.9.1}/abstractframework.egg-info/SOURCES.txt +1 -0
  7. {abstractframework-0.9.0 → abstractframework-0.9.1}/abstractframework.egg-info/requires.txt +3 -3
  8. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/api.md +7 -7
  9. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/install.md +31 -14
  10. {abstractframework-0.9.0 → abstractframework-0.9.1}/llms-full.txt +48 -31
  11. {abstractframework-0.9.0 → abstractframework-0.9.1}/llms.txt +1 -1
  12. {abstractframework-0.9.0 → abstractframework-0.9.1}/pyproject.toml +4 -4
  13. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/install.sh +114 -2
  14. abstractframework-0.9.1/tests/test_install_app_upgrade.py +174 -0
  15. {abstractframework-0.9.0 → abstractframework-0.9.1}/LICENSE +0 -0
  16. {abstractframework-0.9.0 → abstractframework-0.9.1}/MANIFEST.in +0 -0
  17. {abstractframework-0.9.0 → abstractframework-0.9.1}/abstractframework/__main__.py +0 -0
  18. {abstractframework-0.9.0 → abstractframework-0.9.1}/abstractframework/cli.py +0 -0
  19. {abstractframework-0.9.0 → abstractframework-0.9.1}/abstractframework/install_manifest.py +0 -0
  20. {abstractframework-0.9.0 → abstractframework-0.9.1}/abstractframework/py.typed +0 -0
  21. {abstractframework-0.9.0 → abstractframework-0.9.1}/abstractframework.egg-info/dependency_links.txt +0 -0
  22. {abstractframework-0.9.0 → abstractframework-0.9.1}/abstractframework.egg-info/entry_points.txt +0 -0
  23. {abstractframework-0.9.0 → abstractframework-0.9.1}/abstractframework.egg-info/top_level.txt +0 -0
  24. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/README.md +0 -0
  25. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0001-layered-architecture.md +0 -0
  26. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0002-effect-system-design.md +0 -0
  27. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0003-tool-system-architecture.md +0 -0
  28. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0004-observability-strategy.md +0 -0
  29. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0005-memory-architecture.md +0 -0
  30. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0006-durable-tool-execution.md +0 -0
  31. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0007-active-context-and-memory-provenance.md +0 -0
  32. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0008-token-terminology.md +0 -0
  33. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0009-connected-memory-recall-and-provenance.md +0 -0
  34. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0010-runtime-owned-node-traces.md +0 -0
  35. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0011-ledger-subscriptions-and-event-bridge.md +0 -0
  36. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0012-portable-workflowartifact.md +0 -0
  37. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0013-durable-run-controls-pause-resume-cancel.md +0 -0
  38. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0014-runtime-authority-timeouts.md +0 -0
  39. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0015-execution-targets-and-remote-tool-workers.md +0 -0
  40. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0016-tool-calling-pipeline-and-responsibility-boundaries.md +0 -0
  41. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0017-host-ui-events-and-durable-prompts.md +0 -0
  42. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0018-durable-run-gateway-and-remote-host-control-plane.md +0 -0
  43. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0019-testing-strategy-and-levels.md +0 -0
  44. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0020-agent-host-pool-and-orchestrator-placement.md +0 -0
  45. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0021-deployment-topologies-and-supported-scenarios.md +0 -0
  46. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0022-orchestrator-host-and-runtime-daemonization.md +0 -0
  47. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0023-file-attachment-path-resolution-and-authorization.md +0 -0
  48. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0024-attachment-placeholders-and-compaction-invariants.md +0 -0
  49. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0025-kg-entity-normalization-and-dedup.md +0 -0
  50. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0026-truncation-policy-and-contract.md +0 -0
  51. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0027-timeout-policy-and-contract.md +0 -0
  52. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0028-capabilities-plugins-and-library-framework-modes.md +0 -0
  53. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0029-permissive-dependency-and-licensing-policy.md +0 -0
  54. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0030-security-test-fixtures-and-isolation.md +0 -0
  55. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0031-workflow-llm-routing-overrides-provider-model-and-base-url.md +0 -0
  56. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0032-package-dependency-boundaries-and-gateway-first-apps.md +0 -0
  57. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0033-install-profiles-config-entrypoints-and-server-boundaries.md +0 -0
  58. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0034-framework-release-sequence-and-gates.md +0 -0
  59. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0035-capability-routing-defaults.md +0 -0
  60. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0036-artifact-descriptor-contract.md +0 -0
  61. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0037-hosted-file-source-contract-and-workspacepath-authority.md +0 -0
  62. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/0038-script-bootstrap-and-gateway-console-install.md +0 -0
  63. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/README.md +0 -0
  64. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/memory-recall-levels.md +0 -0
  65. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/reorg/001_music_as_capability_plugin_via_acestep_api.md +0 -0
  66. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/reorg/002_abstractmusic_inprocess_local_generation.md +0 -0
  67. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/reorg/003_abstractmusic_acestep_v15_backend_source_strategy.md +0 -0
  68. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/reorg/004_smartnote_thin_client_architecture.md +0 -0
  69. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/reorg/005_smartnote_artifact_first_cards.md +0 -0
  70. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/reorg/2026-02-21_gateway-first-assistant.md +0 -0
  71. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/reorg/2026-02-21_installer_manager_strategy.md +0 -0
  72. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/adr/reorg/2026-02-21_macos_installer_manager.md +0 -0
  73. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/agent-sessions.md +0 -0
  74. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/architecture.md +0 -0
  75. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/automations.md +0 -0
  76. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/claude/README.md +0 -0
  77. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/claude/abstractframework-fit.md +0 -0
  78. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/claude/claude-skills-overview.md +0 -0
  79. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/claude/claude-skills-sources.md +0 -0
  80. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/claude/claude-skills-top-20.md +0 -0
  81. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/comparisons/README.md +0 -0
  82. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/configuration.md +0 -0
  83. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/faq.md +0 -0
  84. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/getting-started.md +0 -0
  85. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/glossary.md +0 -0
  86. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/LANDING.md +0 -0
  87. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/README.md +0 -0
  88. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/agent-skills.md +0 -0
  89. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/agent-vs-llm.md +0 -0
  90. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/agora-workflow-agent.md +0 -0
  91. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/apple-local-gateway-flow.md +0 -0
  92. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/capability-plugins.md +0 -0
  93. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/capability-routing-defaults.md +0 -0
  94. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/deployment-iphone.md +0 -0
  95. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/deployment-topologies.md +0 -0
  96. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/deployment-web.md +0 -0
  97. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/email-integration.md +0 -0
  98. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/event-inbox-agent.md +0 -0
  99. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/flow-and-kg-memory.md +0 -0
  100. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/gateway-security.md +0 -0
  101. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/headless-swarm.md +0 -0
  102. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/process-manager-env-vars.md +0 -0
  103. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/prompt-caching.md +0 -0
  104. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/runtime-artifacts.md +0 -0
  105. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/runtime-scope.md +0 -0
  106. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/scheduled-workflows.md +0 -0
  107. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/summoned-entities.md +0 -0
  108. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/telegram-integration.md +0 -0
  109. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/guide/workflow-bundles.md +0 -0
  110. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/installers/README.md +0 -0
  111. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/installers/components.md +0 -0
  112. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/installers/implementation-plan.md +0 -0
  113. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/installers/operations-and-support.md +0 -0
  114. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/installers/release-and-manifest.md +0 -0
  115. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/installers/security-and-os-blocks.md +0 -0
  116. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/installers/strategy.md +0 -0
  117. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/installers/user-journeys.md +0 -0
  118. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/prompts/agora-collaboration.md +0 -0
  119. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/scenarios/README.md +0 -0
  120. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/scenarios/email-inbox-agent.md +0 -0
  121. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/scenarios/gateway-first-local-dev.md +0 -0
  122. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/scenarios/offline-coding-assistant.md +0 -0
  123. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/scenarios/phone-thin-client.md +0 -0
  124. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/scenarios/specialized-agent-flow.md +0 -0
  125. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/scenarios/telegram-permanent-contact.md +0 -0
  126. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/scenarios/workflow-bundle-lifecycle.md +0 -0
  127. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/skills/README.md +0 -0
  128. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/skills/abstractframework-agent-skills-fit.md +0 -0
  129. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/skills/abstractframework-architecture-deep-dive.md +0 -0
  130. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/skills/agent-skills-ecosystem-scan.md +0 -0
  131. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/skills/agent-skills-ecosystem-sources.md +0 -0
  132. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/skills/claude-agent-skills-overview.md +0 -0
  133. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/skills/claude-agent-skills-sources.md +0 -0
  134. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/skills/claude-agent-skills-top-20.md +0 -0
  135. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/troubleshooting.md +0 -0
  136. {abstractframework-0.9.0 → abstractframework-0.9.1}/docs/workspace-scripts.md +0 -0
  137. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/af-local.sh +0 -0
  138. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/af.sh +0 -0
  139. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/agora_react_flow_smoke.py +0 -0
  140. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/assistant-local.sh +0 -0
  141. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/assistant.sh +0 -0
  142. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/build.sh +0 -0
  143. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/cache_probe_local_backends.py +0 -0
  144. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/cache_steer_repl.py +0 -0
  145. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/check_identity_sync.py +0 -0
  146. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/clone.sh +0 -0
  147. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/code-local.sh +0 -0
  148. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/code.sh +0 -0
  149. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/commit.sh +0 -0
  150. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/console-local.sh +0 -0
  151. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/console.sh +0 -0
  152. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/core_operator_drive.py +0 -0
  153. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/deps.sh +0 -0
  154. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/entity-local.sh +0 -0
  155. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/entity.sh +0 -0
  156. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/event_inbox_flow_smoke.py +0 -0
  157. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/flow-local.sh +0 -0
  158. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/flow.sh +0 -0
  159. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/gateway-flow-local.sh +0 -0
  160. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/gateway-flow.sh +0 -0
  161. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/gateway-local.sh +0 -0
  162. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/gateway.sh +0 -0
  163. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/gen_llms_full.py +0 -0
  164. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/headless_fleet_bridge.py +0 -0
  165. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/headless_fleet_demo.py +0 -0
  166. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/headless_steer_repl.py +0 -0
  167. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/lib/af_inventory.py +0 -0
  168. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/lib/af_stack.sh +0 -0
  169. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/lib/af_supervisor.sh +0 -0
  170. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/lib/apps_common.sh +0 -0
  171. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/lib/build_macos_installer.sh +0 -0
  172. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/lib/gateway_user_tokens.py +0 -0
  173. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/lib/repo_groups.sh +0 -0
  174. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/meet_castor.sh +0 -0
  175. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/observer-local.sh +0 -0
  176. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/observer.sh +0 -0
  177. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/plan_walkthrough.py +0 -0
  178. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/pull.sh +0 -0
  179. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/push.sh +0 -0
  180. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/spawn_demo_agent.sh +0 -0
  181. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/start-local.sh +0 -0
  182. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/start.sh +0 -0
  183. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/status.sh +0 -0
  184. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/steer_repl.py +0 -0
  185. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/tests/test_af_supervisor.sh +0 -0
  186. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/tests/test_install_user_path.sh +0 -0
  187. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/tests/test_inventory.sh +0 -0
  188. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/tests/test_repo_scripts.sh +0 -0
  189. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/uninstall.sh +0 -0
  190. {abstractframework-0.9.0 → abstractframework-0.9.1}/scripts/visit_resume_cache_probe.py +0 -0
  191. {abstractframework-0.9.0 → abstractframework-0.9.1}/setup.cfg +0 -0
  192. {abstractframework-0.9.0 → abstractframework-0.9.1}/tests/test_install_index_lag.py +0 -0
  193. {abstractframework-0.9.0 → abstractframework-0.9.1}/tests/test_install_profiles.py +0 -0
  194. {abstractframework-0.9.0 → abstractframework-0.9.1}/tests/test_install_ps1_gpu_stack.py +0 -0
  195. {abstractframework-0.9.0 → abstractframework-0.9.1}/tests/test_install_ps1_own_gateway.py +0 -0
  196. {abstractframework-0.9.0 → abstractframework-0.9.1}/tests/test_install_sh_gpu_stack.py +0 -0
  197. {abstractframework-0.9.0 → abstractframework-0.9.1}/tests/test_install_sh_gpu_twin.py +0 -0
  198. {abstractframework-0.9.0 → abstractframework-0.9.1}/tests/test_llms_full.py +0 -0
  199. {abstractframework-0.9.0 → abstractframework-0.9.1}/tests/test_uv_tool_install_atomicity.py +0 -0
@@ -6,6 +6,28 @@ All notable changes to AbstractFramework will be documented in this file.
6
6
 
7
7
  Nothing yet.
8
8
 
9
+ ## [0.9.1] - 2026-10-02
10
+
11
+ ### Changed
12
+
13
+ - Pins abstractgateway 0.11.1: the gateway never caps an entity's output (the model works at its
14
+ full capacity; the `ABSTRACTGATEWAY_ENTITY_MAX_OUTPUT_TOKENS` variable is gone and the chat-open
15
+ `max_output_tokens` field is ignored with a deprecation line), and its boot applies the
16
+ installer's `apps-upgrade.pending`, and AbstractCode runs get `send_email` when Agent email tools
17
+ are on (the run input schema serves the effective tools default). Install matrices, the manifest, README and docs regenerated;
18
+ the docs' app and core console version tables now name the 0.9.0 releases (flow 0.7.0, code
19
+ 0.10.0, observer 0.6.0, entity 0.6.0, abstractcore 2.23.0, abstractcore-console 0.7.0).
20
+
21
+ ### Fixed
22
+
23
+ - The installer upgrades the browser apps: on every install and upgrade (`install.sh`, `install.ps1`,
24
+ and the console's **Update**, which runs `--no-start`), each app the gateway has installed is
25
+ brought to the release's pinned version through `abstractgateway apps update <app> --version
26
+ <version>` (a running app restarts on the new bundle); `--print` lists the planned updates, the
27
+ summary lists each app's version, and a failed update is reported in red with exit status 1. With
28
+ no gateway running, the versions go to `<data dir>/apps-upgrade.pending` for the gateway's next
29
+ start. Before, an upgrade left the apps on their old versions (Code web 0.9.0 after 0.9.0).
30
+
9
31
  ## [0.9.0] - 2026-10-01
10
32
 
11
33
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstractframework
3
- Version: 0.9.0
3
+ Version: 0.9.1
4
4
  Summary: Unified installer and documentation hub for the AbstractFramework ecosystem
5
5
  Author-email: Laurent-Philippe Albou <contact@abstractframework.ai>
6
6
  License: MIT
@@ -23,7 +23,7 @@ Classifier: Typing :: Typed
23
23
  Requires-Python: >=3.10
24
24
  Description-Content-Type: text/markdown
25
25
  License-File: LICENSE
26
- Requires-Dist: abstractgateway==0.11.0
26
+ Requires-Dist: abstractgateway==0.11.1
27
27
  Requires-Dist: abstractassistant==0.12.0
28
28
  Requires-Dist: abstractcore==2.23.0
29
29
  Requires-Dist: AbstractRuntime==0.8.3
@@ -36,10 +36,10 @@ Requires-Dist: abstractvision==0.3.33
36
36
  Requires-Dist: abstractmusic==0.1.15
37
37
  Requires-Dist: abstract3d==0.3.2
38
38
  Provides-Extra: apple
39
- Requires-Dist: abstractgateway[apple]==0.11.0; extra == "apple"
39
+ Requires-Dist: abstractgateway[apple]==0.11.1; extra == "apple"
40
40
  Requires-Dist: abstractassistant[apple]==0.12.0; platform_system == "Darwin" and extra == "apple"
41
41
  Provides-Extra: gpu
42
- Requires-Dist: abstractgateway[gpu]==0.11.0; extra == "gpu"
42
+ Requires-Dist: abstractgateway[gpu]==0.11.1; extra == "gpu"
43
43
  Requires-Dist: abstractassistant[gpu]==0.12.0; extra == "gpu"
44
44
  Dynamic: license-file
45
45
 
@@ -369,7 +369,7 @@ pip install "abstractframework[gpu]"
369
369
  | Apple | `pip install "abstractframework[apple]"` | macOS 14+ on Apple Silicon | 3.10–3.13 (F5-TTS voice cloning needs 3.11+) |
370
370
  | GPU | `pip install "abstractframework[gpu]"` | Linux with a CUDA or ROCm GPU; on Windows, use the one-line installer (a plain pip install gets PyPI's CPU-only PyTorch and no llama.cpp) | 3.10–3.13 (F5-TTS voice cloning needs 3.11+) |
371
371
 
372
- ### Release matrix (abstractframework 0.9.0)
372
+ ### Release matrix (abstractframework 0.9.1)
373
373
 
374
374
  `abstractframework` pins every Python package with `==`, so one version of the
375
375
  meta-package always installs the same stack. The browser apps and Rust tools are
@@ -378,7 +378,7 @@ and tested together.
378
378
 
379
379
  | Registry | Package | Version |
380
380
  |---|---|---|
381
- | PyPI | `abstractgateway` | 0.11.0 |
381
+ | PyPI | `abstractgateway` | 0.11.1 |
382
382
  | PyPI | `abstractassistant` | 0.12.0 |
383
383
  | PyPI | `abstractcore` | 2.23.0 |
384
384
  | PyPI | `AbstractRuntime` | 0.8.3 |
@@ -399,7 +399,7 @@ and tested together.
399
399
  | crates.io | `abstractgateway-console` | 0.14.0 |
400
400
  | crates.io | `abstractcore-console` | 0.7.0 |
401
401
  | crates.io | `abstracttui` | 0.6.0 |
402
- | GHCR | `ghcr.io/lpalbou/abstractgateway` | 0.11.0 (`gpu-latest` / `<version>-gpu` experimental) |
402
+ | GHCR | `ghcr.io/lpalbou/abstractgateway` | 0.11.1 (`gpu-latest` / `<version>-gpu` experimental) |
403
403
  | GHCR | `ghcr.io/lpalbou/abstractcore-server` | 2.23.0 |
404
404
 
405
405
  `abstract3d` (pinned above) comes with AbstractCore in every profile. The optional add-on that is
@@ -324,7 +324,7 @@ pip install "abstractframework[gpu]"
324
324
  | Apple | `pip install "abstractframework[apple]"` | macOS 14+ on Apple Silicon | 3.10–3.13 (F5-TTS voice cloning needs 3.11+) |
325
325
  | GPU | `pip install "abstractframework[gpu]"` | Linux with a CUDA or ROCm GPU; on Windows, use the one-line installer (a plain pip install gets PyPI's CPU-only PyTorch and no llama.cpp) | 3.10–3.13 (F5-TTS voice cloning needs 3.11+) |
326
326
 
327
- ### Release matrix (abstractframework 0.9.0)
327
+ ### Release matrix (abstractframework 0.9.1)
328
328
 
329
329
  `abstractframework` pins every Python package with `==`, so one version of the
330
330
  meta-package always installs the same stack. The browser apps and Rust tools are
@@ -333,7 +333,7 @@ and tested together.
333
333
 
334
334
  | Registry | Package | Version |
335
335
  |---|---|---|
336
- | PyPI | `abstractgateway` | 0.11.0 |
336
+ | PyPI | `abstractgateway` | 0.11.1 |
337
337
  | PyPI | `abstractassistant` | 0.12.0 |
338
338
  | PyPI | `abstractcore` | 2.23.0 |
339
339
  | PyPI | `AbstractRuntime` | 0.8.3 |
@@ -354,7 +354,7 @@ and tested together.
354
354
  | crates.io | `abstractgateway-console` | 0.14.0 |
355
355
  | crates.io | `abstractcore-console` | 0.7.0 |
356
356
  | crates.io | `abstracttui` | 0.6.0 |
357
- | GHCR | `ghcr.io/lpalbou/abstractgateway` | 0.11.0 (`gpu-latest` / `<version>-gpu` experimental) |
357
+ | GHCR | `ghcr.io/lpalbou/abstractgateway` | 0.11.1 (`gpu-latest` / `<version>-gpu` experimental) |
358
358
  | GHCR | `ghcr.io/lpalbou/abstractcore-server` | 2.23.0 |
359
359
 
360
360
  `abstract3d` (pinned above) comes with AbstractCore in every profile. The optional add-on that is
@@ -10,7 +10,7 @@ Most implementation functionality still lives in component projects.
10
10
 
11
11
  from __future__ import annotations
12
12
 
13
- __version__ = "0.9.0"
13
+ __version__ = "0.9.1"
14
14
  __author__ = "Laurent-Philippe Albou"
15
15
  __license__ = "MIT"
16
16
 
@@ -18,7 +18,7 @@ RELEASE_VERSIONS: dict[str, str] = {
18
18
  "abstractcore": "2.23.0",
19
19
  "abstractruntime": "0.8.3",
20
20
  "abstractagent": "0.3.17",
21
- "abstractgateway": "0.11.0",
21
+ "abstractgateway": "0.11.1",
22
22
  "abstractskill": "0.3.0",
23
23
  "abstractmemory": "0.3.0",
24
24
  "abstractsemantics": "0.0.5",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstractframework
3
- Version: 0.9.0
3
+ Version: 0.9.1
4
4
  Summary: Unified installer and documentation hub for the AbstractFramework ecosystem
5
5
  Author-email: Laurent-Philippe Albou <contact@abstractframework.ai>
6
6
  License: MIT
@@ -23,7 +23,7 @@ Classifier: Typing :: Typed
23
23
  Requires-Python: >=3.10
24
24
  Description-Content-Type: text/markdown
25
25
  License-File: LICENSE
26
- Requires-Dist: abstractgateway==0.11.0
26
+ Requires-Dist: abstractgateway==0.11.1
27
27
  Requires-Dist: abstractassistant==0.12.0
28
28
  Requires-Dist: abstractcore==2.23.0
29
29
  Requires-Dist: AbstractRuntime==0.8.3
@@ -36,10 +36,10 @@ Requires-Dist: abstractvision==0.3.33
36
36
  Requires-Dist: abstractmusic==0.1.15
37
37
  Requires-Dist: abstract3d==0.3.2
38
38
  Provides-Extra: apple
39
- Requires-Dist: abstractgateway[apple]==0.11.0; extra == "apple"
39
+ Requires-Dist: abstractgateway[apple]==0.11.1; extra == "apple"
40
40
  Requires-Dist: abstractassistant[apple]==0.12.0; platform_system == "Darwin" and extra == "apple"
41
41
  Provides-Extra: gpu
42
- Requires-Dist: abstractgateway[gpu]==0.11.0; extra == "gpu"
42
+ Requires-Dist: abstractgateway[gpu]==0.11.1; extra == "gpu"
43
43
  Requires-Dist: abstractassistant[gpu]==0.12.0; extra == "gpu"
44
44
  Dynamic: license-file
45
45
 
@@ -369,7 +369,7 @@ pip install "abstractframework[gpu]"
369
369
  | Apple | `pip install "abstractframework[apple]"` | macOS 14+ on Apple Silicon | 3.10–3.13 (F5-TTS voice cloning needs 3.11+) |
370
370
  | GPU | `pip install "abstractframework[gpu]"` | Linux with a CUDA or ROCm GPU; on Windows, use the one-line installer (a plain pip install gets PyPI's CPU-only PyTorch and no llama.cpp) | 3.10–3.13 (F5-TTS voice cloning needs 3.11+) |
371
371
 
372
- ### Release matrix (abstractframework 0.9.0)
372
+ ### Release matrix (abstractframework 0.9.1)
373
373
 
374
374
  `abstractframework` pins every Python package with `==`, so one version of the
375
375
  meta-package always installs the same stack. The browser apps and Rust tools are
@@ -378,7 +378,7 @@ and tested together.
378
378
 
379
379
  | Registry | Package | Version |
380
380
  |---|---|---|
381
- | PyPI | `abstractgateway` | 0.11.0 |
381
+ | PyPI | `abstractgateway` | 0.11.1 |
382
382
  | PyPI | `abstractassistant` | 0.12.0 |
383
383
  | PyPI | `abstractcore` | 2.23.0 |
384
384
  | PyPI | `AbstractRuntime` | 0.8.3 |
@@ -399,7 +399,7 @@ and tested together.
399
399
  | crates.io | `abstractgateway-console` | 0.14.0 |
400
400
  | crates.io | `abstractcore-console` | 0.7.0 |
401
401
  | crates.io | `abstracttui` | 0.6.0 |
402
- | GHCR | `ghcr.io/lpalbou/abstractgateway` | 0.11.0 (`gpu-latest` / `<version>-gpu` experimental) |
402
+ | GHCR | `ghcr.io/lpalbou/abstractgateway` | 0.11.1 (`gpu-latest` / `<version>-gpu` experimental) |
403
403
  | GHCR | `ghcr.io/lpalbou/abstractcore-server` | 2.23.0 |
404
404
 
405
405
  `abstract3d` (pinned above) comes with AbstractCore in every profile. The optional add-on that is
@@ -186,6 +186,7 @@ scripts/tests/test_af_supervisor.sh
186
186
  scripts/tests/test_install_user_path.sh
187
187
  scripts/tests/test_inventory.sh
188
188
  scripts/tests/test_repo_scripts.sh
189
+ tests/test_install_app_upgrade.py
189
190
  tests/test_install_index_lag.py
190
191
  tests/test_install_profiles.py
191
192
  tests/test_install_ps1_gpu_stack.py
@@ -1,4 +1,4 @@
1
- abstractgateway==0.11.0
1
+ abstractgateway==0.11.1
2
2
  abstractassistant==0.12.0
3
3
  abstractcore==2.23.0
4
4
  AbstractRuntime==0.8.3
@@ -12,11 +12,11 @@ abstractmusic==0.1.15
12
12
  abstract3d==0.3.2
13
13
 
14
14
  [apple]
15
- abstractgateway[apple]==0.11.0
15
+ abstractgateway[apple]==0.11.1
16
16
 
17
17
  [apple:platform_system == "Darwin"]
18
18
  abstractassistant[apple]==0.12.0
19
19
 
20
20
  [gpu]
21
- abstractgateway[gpu]==0.11.0
21
+ abstractgateway[gpu]==0.11.1
22
22
  abstractassistant[gpu]==0.12.0
@@ -55,14 +55,14 @@ The response type returned by `llm.generate(...)`.
55
55
 
56
56
  ### `__version__`
57
57
 
58
- The meta-package version (`0.9.0` for this release).
58
+ The meta-package version (`0.9.1` for this release).
59
59
 
60
60
  ### `RELEASE_VERSIONS`
61
61
 
62
- Dictionary mapping each ecosystem package name to the pinned version for this release. In 0.8.0:
63
- `abstractcore` 2.22.0, `abstractruntime` 0.8.2, `abstractagent` 0.3.17, `abstractgateway` 0.10.0,
62
+ Dictionary mapping each ecosystem package name to the pinned version for this release. In 0.9.1:
63
+ `abstractcore` 2.23.0, `abstractruntime` 0.8.3, `abstractagent` 0.3.17, `abstractgateway` 0.11.1,
64
64
  `abstractskill` 0.3.0, `abstractmemory` 0.3.0, `abstractsemantics` 0.0.5, `abstractvoice` 0.13.2, `abstractvision` 0.3.33,
65
- `abstractmusic` 0.1.15, `abstract3d` 0.3.2, `abstractassistant` 0.11.0.
65
+ `abstractmusic` 0.1.15, `abstract3d` 0.3.2, `abstractassistant` 0.12.0.
66
66
 
67
67
  ### `PACKAGE_DISTRIBUTIONS`
68
68
 
@@ -72,9 +72,9 @@ Maps each package name in `RELEASE_VERSIONS` to its PyPI distribution name (for
72
72
  ### `NPM_RELEASE_VERSIONS`
73
73
 
74
74
  The npm apps released with this version, each runnable with `npx <package>`:
75
- `@abstractframework/flow` 0.6.0, `@abstractframework/code` 0.9.0,
76
- `@abstractframework/observer` 0.5.0, `@abstractframework/continuum` 0.6.0 and
77
- `@abstractframework/entity` 0.5.0. They also appear as `npm_apps` in the install manifest.
75
+ `@abstractframework/flow` 0.7.0, `@abstractframework/code` 0.10.0,
76
+ `@abstractframework/observer` 0.6.0, `@abstractframework/continuum` 0.6.0 and
77
+ `@abstractframework/entity` 0.6.0. They also appear as `npm_apps` in the install manifest.
78
78
 
79
79
  ### `CRATE_RELEASE_VERSIONS`
80
80
 
@@ -197,7 +197,7 @@ The line always runs the installer of the latest AbstractFramework release. It:
197
197
  <latest>`, or `AbstractFramework <yours> found: already up to date` (every part is still checked,
198
198
  and repaired when needed). An install made by 0.6.1 or earlier recorded no release, so its first
199
199
  upgrade says `AbstractFramework found (abstractgateway 0.7.1; its release was not recorded):
200
- upgrading to AbstractFramework 0.9.0` (with the gateway version you have);
200
+ upgrading to AbstractFramework 0.9.1` (with the gateway version you have);
201
201
  - installs the gateway version that release pins, and every library the gateway uses
202
202
  (AbstractCore, AbstractRuntime, AbstractAgent, AbstractSkill, AbstractMemory, AbstractSemantics
203
203
  and the voice, vision, music and 3D packages) at the exact version released and tested with it ([Check your versions](#check-your-versions) shows
@@ -245,7 +245,7 @@ The line always runs the installer of the latest AbstractFramework release. It:
245
245
 
246
246
  Installs made by AbstractFramework 0.6.1 or earlier recorded neither their release nor your install
247
247
  options. The first re-run says `AbstractFramework found (abstractgateway <version>; its release was
248
- not recorded): upgrading to AbstractFramework 0.9.0`, and reads your options from what is installed: whether the terminal console and `abstractcode` are
248
+ not recorded): upgrading to AbstractFramework 0.9.1`, and reads your options from what is installed: whether the terminal console and `abstractcode` are
249
249
  there, whether the gateway has the tray extra and the AbstractCore commands, whether the compiled
250
250
  extras were built (`--full`), and a custom data directory through the gateway pointer. It prints
251
251
  what it found (`read from disk: …`) and records it for later runs. An option the installer did not
@@ -355,9 +355,26 @@ Running workflows pause at their next step and continue after the restart.
355
355
 
356
356
  ### Upgrade the apps
357
357
 
358
- The browser apps (Flow, Code, Observer, Continuum, Entity) and the desktop Assistant are installed
359
- by the gateway, so the installer does not change them. When npm has a newer version, the app's card
360
- on the console's **Apps** page offers **Update** under **Technical details**. In a terminal:
358
+ The browser apps (Flow, Code, Observer, Continuum, Entity) are installed by the gateway, and the
359
+ installer keeps them on the release: on every install and upgrade, once the gateway answers, each
360
+ browser app the gateway has installed is brought to this release's version (`--print` lists the
361
+ planned updates) through the gateway's own `abstractgateway apps update <app> --version <version>`,
362
+ so the gateway's apps registry stays right and a running app restarts on the new version. It is a
363
+ command-line call against the running gateway (signed in with `<data dir>/auth/bootstrap-admin-token`),
364
+ so it works the same on a headless or terminal-only machine: no browser or web console is involved. The
365
+ summary's **Apps** line lists each app's version; an app that could not be updated is listed in red
366
+ with the command to retry, and the installer exits 1. A fresh install installs no app: the console's
367
+ **Apps** page installs them.
368
+
369
+ When no gateway answers (`--no-start` while the gateway is stopped), the installer writes the
370
+ release's versions to `<data dir>/apps-upgrade.pending` instead, and the gateway (0.11.1 and later)
371
+ brings its installed apps to those versions when it next starts, then removes the file. The
372
+ console's **Update** runs the installer with `--no-start` while the gateway is running, so its apps
373
+ are updated right away.
374
+
375
+ The desktop Assistant is a Python app the gateway installs; the installer leaves it as it is. When
376
+ npm has a newer version of an app, its card on the console's **Apps** page offers **Update** under
377
+ **Technical details**. In a terminal:
361
378
 
362
379
  ```bash
363
380
  abstractgateway apps list # installed and latest version of every app
@@ -448,7 +465,7 @@ The Mac package, the `.command` files and the one line all run the same script,
448
465
  login** switch counts), a first install leaves it off.
449
466
  3. Installs [uv](https://docs.astral.sh/uv/) when it is missing, then Python 3.12 through uv.
450
467
  4. Installs the gateway as an isolated uv tool, pinned to this release:
451
- `uv tool install --python 3.12 "abstractgateway[<profile>,tray]==0.11.0"`, from prebuilt wheels
468
+ `uv tool install --python 3.12 "abstractgateway[<profile>,tray]==0.11.1"`, from prebuilt wheels
452
469
  only (see [No compiler needed](#no-compiler-needed)), and checks that the command starts
453
470
  (reinstalling it in place when it does not). Every profile also gets local voice,
454
471
  `--with "abstractvoice[supertonic,stt]==0.13.2"` (the release's AbstractVoice): Supertonic
@@ -793,7 +810,7 @@ instead of starting a browser.
793
810
  ```bash
794
811
  curl -LsSf https://astral.sh/uv/install.sh | sh # Windows: irm https://astral.sh/uv/install.ps1 | iex
795
812
  uv python install 3.12
796
- uv tool install --python 3.12 "abstractgateway[tray]==0.11.0" # [apple,tray] or [gpu,tray] for local engines
813
+ uv tool install --python 3.12 "abstractgateway[tray]==0.11.1" # [apple,tray] or [gpu,tray] for local engines
797
814
  # (add --with and --overrides as shown by `install.sh --print` to avoid compiling)
798
815
  uv tool update-shell # puts ~/.local/bin on PATH; open a new terminal
799
816
  abstractgateway service install --port 8080 # or: abstractgateway serve
@@ -920,7 +937,7 @@ Python 3.11 to 3.13), but it gets PyPI's CPU-only PyTorch and no llama.cpp: use
920
937
  installer, which adds PyTorch's CUDA build and llama.cpp's prebuilt GPU build
921
938
  ([GPU on Windows](#gpu-on-windows-nvidia)).
922
939
 
923
- `abstractframework` 0.9.0 pins `abstractgateway==0.11.0`, `abstractassistant==0.12.0`,
940
+ `abstractframework` 0.9.1 pins `abstractgateway==0.11.1`, `abstractassistant==0.12.0`,
924
941
  `abstractcore==2.23.0`, `AbstractRuntime==0.8.3`, `abstractagent==0.3.17`, `abstractskill==0.3.0`,
925
942
  `AbstractMemory==0.3.0`, `abstractsemantics==0.0.5`, `abstractvoice==0.13.2`,
926
943
  `abstractvision==0.3.33`, `abstractmusic==0.1.15` and `abstract3d==0.3.2`. The `apple` and `gpu` extras select
@@ -1012,14 +1029,14 @@ Run or install them next to the Python stack:
1012
1029
  | Tool | Command | Version released with 0.8.0 |
1013
1030
  |---|---|---|
1014
1031
  | Gateway web console | built into `abstractgateway`: open the link `abstractgateway serve` prints (`http://127.0.0.1:8080/console#claim=…`) | 0.10.0 |
1015
- | Core web console | built into `abstractcore`: open the link `abstractcore serve` prints (`http://127.0.0.1:8000/console#claim=…`) | 2.22.0 |
1016
- | Core terminal console | `cargo install abstractcore-console` (Rust 1.87+), then `abstractcore-console` (uses the `abstractcore` command). The installers do not build it: it is the console of a standalone `abstractcore serve`, and the gateway's terminal console already has its Models and Engines screens | 0.6.0 |
1032
+ | Core web console | built into `abstractcore`: open the link `abstractcore serve` prints (`http://127.0.0.1:8000/console#claim=…`) | 2.23.0 |
1033
+ | Core terminal console | `cargo install abstractcore-console` (Rust 1.87+), then `abstractcore-console` (uses the `abstractcore` command). The installers do not build it: it is the console of a standalone `abstractcore serve`, and the gateway's terminal console already has its Models and Engines screens | 0.7.0 |
1017
1034
  | Gateway terminal console | built by the installer (`--no-console` skips it), or `cargo install abstractgateway-console` (Rust 1.87+); then `abstractgateway-console --gateway-url http://127.0.0.1:8080 --token <admin token>` | 0.14.0 |
1018
- | Flow Editor | the console's **Apps** page (opens at `/apps/flow/`), or on its own: `npx @abstractframework/flow --gateway-url <url>` | 0.6.0 |
1019
- | Code Web UI | the console's **Apps** page (`/apps/code/`), or `npx @abstractframework/code --gateway-url <url>` | 0.9.0 |
1020
- | Observer | the console's **Apps** page (`/apps/observer/`), or `npx @abstractframework/observer --gateway-url <url>` | 0.5.0 |
1035
+ | Flow Editor | the console's **Apps** page (opens at `/apps/flow/`), or on its own: `npx @abstractframework/flow --gateway-url <url>` | 0.7.0 |
1036
+ | Code Web UI | the console's **Apps** page (`/apps/code/`), or `npx @abstractframework/code --gateway-url <url>` | 0.10.0 |
1037
+ | Observer | the console's **Apps** page (`/apps/observer/`), or `npx @abstractframework/observer --gateway-url <url>` | 0.6.0 |
1021
1038
  | Continuum console | the console's **Apps** page (`/apps/continuum/`), or `npx @abstractframework/continuum --gateway-url <url>` | 0.6.0 |
1022
- | Entity manager | the console's **Apps** page (`/apps/entity/`), or `npx @abstractframework/entity --gateway-url <url>` | 0.5.0 |
1039
+ | Entity manager | the console's **Apps** page (`/apps/entity/`), or `npx @abstractframework/entity --gateway-url <url>` | 0.6.0 |
1023
1040
  | AbstractCode terminal client | `cargo install abstractcode`, or a prebuilt binary from the [AbstractCode GitHub release](https://github.com/lpalbou/AbstractCode/releases) | 0.8.0 |
1024
1041
 
1025
1042
  The browser apps need a running gateway. The gateway installs, starts and serves them itself, on
@@ -328,7 +328,7 @@ pip install "abstractframework[gpu]"
328
328
  | Apple | `pip install "abstractframework[apple]"` | macOS 14+ on Apple Silicon | 3.10–3.13 (F5-TTS voice cloning needs 3.11+) |
329
329
  | GPU | `pip install "abstractframework[gpu]"` | Linux with a CUDA or ROCm GPU; on Windows, use the one-line installer (a plain pip install gets PyPI's CPU-only PyTorch and no llama.cpp) | 3.10–3.13 (F5-TTS voice cloning needs 3.11+) |
330
330
 
331
- ### Release matrix (abstractframework 0.9.0)
331
+ ### Release matrix (abstractframework 0.9.1)
332
332
 
333
333
  `abstractframework` pins every Python package with `==`, so one version of the
334
334
  meta-package always installs the same stack. The browser apps and Rust tools are
@@ -337,7 +337,7 @@ and tested together.
337
337
 
338
338
  | Registry | Package | Version |
339
339
  |---|---|---|
340
- | PyPI | `abstractgateway` | 0.11.0 |
340
+ | PyPI | `abstractgateway` | 0.11.1 |
341
341
  | PyPI | `abstractassistant` | 0.12.0 |
342
342
  | PyPI | `abstractcore` | 2.23.0 |
343
343
  | PyPI | `AbstractRuntime` | 0.8.3 |
@@ -358,7 +358,7 @@ and tested together.
358
358
  | crates.io | `abstractgateway-console` | 0.14.0 |
359
359
  | crates.io | `abstractcore-console` | 0.7.0 |
360
360
  | crates.io | `abstracttui` | 0.6.0 |
361
- | GHCR | `ghcr.io/lpalbou/abstractgateway` | 0.11.0 (`gpu-latest` / `<version>-gpu` experimental) |
361
+ | GHCR | `ghcr.io/lpalbou/abstractgateway` | 0.11.1 (`gpu-latest` / `<version>-gpu` experimental) |
362
362
  | GHCR | `ghcr.io/lpalbou/abstractcore-server` | 2.23.0 |
363
363
 
364
364
  `abstract3d` (pinned above) comes with AbstractCore in every profile. The optional add-on that is
@@ -611,7 +611,7 @@ Notes for LLMs working in this repo:
611
611
  - [abstractframework/__init__.py](abstractframework/__init__.py): `RELEASE_VERSIONS`, `NPM_RELEASE_VERSIONS`, `CRATE_RELEASE_VERSIONS`, `get_release_profile()`, `print_status()`.
612
612
  - [docs/installers/install-manifest.json](docs/installers/install-manifest.json): Generated install manifest, schema v2 (pins, profiles, npm apps, `bootstrap` gateway pin/scripts/flags, console-first `post_install`).
613
613
  - [scripts/install.sh](scripts/install.sh) / [scripts/install.ps1](scripts/install.ps1): The bootstrap installers.
614
- - abstractframework 0.8.0 pins (PyPI, `==`): abstractgateway 0.10.0, abstractassistant 0.11.0, abstractcore 2.22.0, AbstractRuntime 0.8.2, abstractagent 0.3.17, abstractskill 0.3.0, AbstractMemory 0.3.0, abstractsemantics 0.0.5, abstractvoice 0.13.2, abstractvision 0.3.33, abstractmusic 0.1.15, abstract3d 0.3.2.
614
+ - abstractframework 0.9.1 pins (PyPI, `==`): abstractgateway 0.11.1, abstractassistant 0.12.0, abstractcore 2.23.0, AbstractRuntime 0.8.3, abstractagent 0.3.17, abstractskill 0.3.0, AbstractMemory 0.3.0, abstractsemantics 0.0.5, abstractvoice 0.13.2, abstractvision 0.3.33, abstractmusic 0.1.15, abstract3d 0.3.2.
615
615
  - Released with it: npm `@abstractframework/flow` 0.6.0, `code` 0.9.0, `observer` 0.5.0, `continuum` 0.6.0, `entity` 0.5.0 (opened through the gateway at `/apps/<app>/`, or run with `npx`); crates (`CRATE_RELEASE_VERSIONS`) `abstractgateway-console` 0.13.0 (built by the installer by default), `abstractcore-console` 0.6.0, `abstractcode` 0.8.0, `abstracttui` 0.6.0; images `ghcr.io/lpalbou/abstractgateway:0.10.0`, `ghcr.io/lpalbou/abstractcore-server:2.22.0`.
616
616
  - Profiles: light (remote-only), apple (`abstractframework[apple]`, macOS 14+ Apple Silicon), gpu (`abstractframework[gpu]`); Python 3.10-3.13 (F5-TTS voice cloning in apple/gpu needs 3.11+).
617
617
 
@@ -640,7 +640,7 @@ build-backend = "setuptools.build_meta"
640
640
 
641
641
  [project]
642
642
  name = "abstractframework"
643
- version = "0.9.0"
643
+ version = "0.9.1"
644
644
  description = "Unified installer and documentation hub for the AbstractFramework ecosystem"
645
645
  readme = "README.md"
646
646
  license = {text = "MIT"}
@@ -684,7 +684,7 @@ requires-python = ">=3.10"
684
684
  # - Keep the meta-package aligned with the real per-package profiles (especially `abstractgateway`).
685
685
  dependencies = [
686
686
  # Durable Gateway control plane (remote-light by default).
687
- "abstractgateway==0.11.0",
687
+ "abstractgateway==0.11.1",
688
688
 
689
689
  # Workflow authoring UI is distributed through npm as @abstractframework/flow.
690
690
  "abstractassistant==0.12.0",
@@ -718,12 +718,12 @@ dependencies = [
718
718
  # the stack by selecting the hardware-local dependency aggregates (owned by Gateway),
719
719
  # then adds user-facing apps.
720
720
  apple = [
721
- "abstractgateway[apple]==0.11.0",
721
+ "abstractgateway[apple]==0.11.1",
722
722
  "abstractassistant[apple]==0.12.0; platform_system == \"Darwin\"",
723
723
  ]
724
724
 
725
725
  gpu = [
726
- "abstractgateway[gpu]==0.11.0",
726
+ "abstractgateway[gpu]==0.11.1",
727
727
  "abstractassistant[gpu]==0.12.0",
728
728
  ]
729
729
 
@@ -774,7 +774,7 @@ Most implementation functionality still lives in component projects.
774
774
 
775
775
  from __future__ import annotations
776
776
 
777
- __version__ = "0.9.0"
777
+ __version__ = "0.9.1"
778
778
  __author__ = "Laurent-Philippe Albou"
779
779
  __license__ = "MIT"
780
780
 
@@ -782,7 +782,7 @@ RELEASE_VERSIONS: dict[str, str] = {
782
782
  "abstractcore": "2.23.0",
783
783
  "abstractruntime": "0.8.3",
784
784
  "abstractagent": "0.3.17",
785
- "abstractgateway": "0.11.0",
785
+ "abstractgateway": "0.11.1",
786
786
  "abstractskill": "0.3.0",
787
787
  "abstractmemory": "0.3.0",
788
788
  "abstractsemantics": "0.0.5",
@@ -3935,7 +3935,7 @@ The line always runs the installer of the latest AbstractFramework release. It:
3935
3935
  <latest>`, or `AbstractFramework <yours> found: already up to date` (every part is still checked,
3936
3936
  and repaired when needed). An install made by 0.6.1 or earlier recorded no release, so its first
3937
3937
  upgrade says `AbstractFramework found (abstractgateway 0.7.1; its release was not recorded):
3938
- upgrading to AbstractFramework 0.9.0` (with the gateway version you have);
3938
+ upgrading to AbstractFramework 0.9.1` (with the gateway version you have);
3939
3939
  - installs the gateway version that release pins, and every library the gateway uses
3940
3940
  (AbstractCore, AbstractRuntime, AbstractAgent, AbstractSkill, AbstractMemory, AbstractSemantics
3941
3941
  and the voice, vision, music and 3D packages) at the exact version released and tested with it ([Check your versions](#check-your-versions) shows
@@ -3983,7 +3983,7 @@ The line always runs the installer of the latest AbstractFramework release. It:
3983
3983
 
3984
3984
  Installs made by AbstractFramework 0.6.1 or earlier recorded neither their release nor your install
3985
3985
  options. The first re-run says `AbstractFramework found (abstractgateway <version>; its release was
3986
- not recorded): upgrading to AbstractFramework 0.9.0`, and reads your options from what is installed: whether the terminal console and `abstractcode` are
3986
+ not recorded): upgrading to AbstractFramework 0.9.1`, and reads your options from what is installed: whether the terminal console and `abstractcode` are
3987
3987
  there, whether the gateway has the tray extra and the AbstractCore commands, whether the compiled
3988
3988
  extras were built (`--full`), and a custom data directory through the gateway pointer. It prints
3989
3989
  what it found (`read from disk: …`) and records it for later runs. An option the installer did not
@@ -4093,9 +4093,26 @@ Running workflows pause at their next step and continue after the restart.
4093
4093
 
4094
4094
  ### Upgrade the apps
4095
4095
 
4096
- The browser apps (Flow, Code, Observer, Continuum, Entity) and the desktop Assistant are installed
4097
- by the gateway, so the installer does not change them. When npm has a newer version, the app's card
4098
- on the console's **Apps** page offers **Update** under **Technical details**. In a terminal:
4096
+ The browser apps (Flow, Code, Observer, Continuum, Entity) are installed by the gateway, and the
4097
+ installer keeps them on the release: on every install and upgrade, once the gateway answers, each
4098
+ browser app the gateway has installed is brought to this release's version (`--print` lists the
4099
+ planned updates) through the gateway's own `abstractgateway apps update <app> --version <version>`,
4100
+ so the gateway's apps registry stays right and a running app restarts on the new version. It is a
4101
+ command-line call against the running gateway (signed in with `<data dir>/auth/bootstrap-admin-token`),
4102
+ so it works the same on a headless or terminal-only machine: no browser or web console is involved. The
4103
+ summary's **Apps** line lists each app's version; an app that could not be updated is listed in red
4104
+ with the command to retry, and the installer exits 1. A fresh install installs no app: the console's
4105
+ **Apps** page installs them.
4106
+
4107
+ When no gateway answers (`--no-start` while the gateway is stopped), the installer writes the
4108
+ release's versions to `<data dir>/apps-upgrade.pending` instead, and the gateway (0.11.1 and later)
4109
+ brings its installed apps to those versions when it next starts, then removes the file. The
4110
+ console's **Update** runs the installer with `--no-start` while the gateway is running, so its apps
4111
+ are updated right away.
4112
+
4113
+ The desktop Assistant is a Python app the gateway installs; the installer leaves it as it is. When
4114
+ npm has a newer version of an app, its card on the console's **Apps** page offers **Update** under
4115
+ **Technical details**. In a terminal:
4099
4116
 
4100
4117
  ```bash
4101
4118
  abstractgateway apps list # installed and latest version of every app
@@ -4186,7 +4203,7 @@ The Mac package, the `.command` files and the one line all run the same script,
4186
4203
  login** switch counts), a first install leaves it off.
4187
4204
  3. Installs [uv](https://docs.astral.sh/uv/) when it is missing, then Python 3.12 through uv.
4188
4205
  4. Installs the gateway as an isolated uv tool, pinned to this release:
4189
- `uv tool install --python 3.12 "abstractgateway[<profile>,tray]==0.11.0"`, from prebuilt wheels
4206
+ `uv tool install --python 3.12 "abstractgateway[<profile>,tray]==0.11.1"`, from prebuilt wheels
4190
4207
  only (see [No compiler needed](#no-compiler-needed)), and checks that the command starts
4191
4208
  (reinstalling it in place when it does not). Every profile also gets local voice,
4192
4209
  `--with "abstractvoice[supertonic,stt]==0.13.2"` (the release's AbstractVoice): Supertonic
@@ -4531,7 +4548,7 @@ instead of starting a browser.
4531
4548
  ```bash
4532
4549
  curl -LsSf https://astral.sh/uv/install.sh | sh # Windows: irm https://astral.sh/uv/install.ps1 | iex
4533
4550
  uv python install 3.12
4534
- uv tool install --python 3.12 "abstractgateway[tray]==0.11.0" # [apple,tray] or [gpu,tray] for local engines
4551
+ uv tool install --python 3.12 "abstractgateway[tray]==0.11.1" # [apple,tray] or [gpu,tray] for local engines
4535
4552
  # (add --with and --overrides as shown by `install.sh --print` to avoid compiling)
4536
4553
  uv tool update-shell # puts ~/.local/bin on PATH; open a new terminal
4537
4554
  abstractgateway service install --port 8080 # or: abstractgateway serve
@@ -4658,7 +4675,7 @@ Python 3.11 to 3.13), but it gets PyPI's CPU-only PyTorch and no llama.cpp: use
4658
4675
  installer, which adds PyTorch's CUDA build and llama.cpp's prebuilt GPU build
4659
4676
  ([GPU on Windows](#gpu-on-windows-nvidia)).
4660
4677
 
4661
- `abstractframework` 0.9.0 pins `abstractgateway==0.11.0`, `abstractassistant==0.12.0`,
4678
+ `abstractframework` 0.9.1 pins `abstractgateway==0.11.1`, `abstractassistant==0.12.0`,
4662
4679
  `abstractcore==2.23.0`, `AbstractRuntime==0.8.3`, `abstractagent==0.3.17`, `abstractskill==0.3.0`,
4663
4680
  `AbstractMemory==0.3.0`, `abstractsemantics==0.0.5`, `abstractvoice==0.13.2`,
4664
4681
  `abstractvision==0.3.33`, `abstractmusic==0.1.15` and `abstract3d==0.3.2`. The `apple` and `gpu` extras select
@@ -4750,14 +4767,14 @@ Run or install them next to the Python stack:
4750
4767
  | Tool | Command | Version released with 0.8.0 |
4751
4768
  |---|---|---|
4752
4769
  | Gateway web console | built into `abstractgateway`: open the link `abstractgateway serve` prints (`http://127.0.0.1:8080/console#claim=…`) | 0.10.0 |
4753
- | Core web console | built into `abstractcore`: open the link `abstractcore serve` prints (`http://127.0.0.1:8000/console#claim=…`) | 2.22.0 |
4754
- | Core terminal console | `cargo install abstractcore-console` (Rust 1.87+), then `abstractcore-console` (uses the `abstractcore` command). The installers do not build it: it is the console of a standalone `abstractcore serve`, and the gateway's terminal console already has its Models and Engines screens | 0.6.0 |
4770
+ | Core web console | built into `abstractcore`: open the link `abstractcore serve` prints (`http://127.0.0.1:8000/console#claim=…`) | 2.23.0 |
4771
+ | Core terminal console | `cargo install abstractcore-console` (Rust 1.87+), then `abstractcore-console` (uses the `abstractcore` command). The installers do not build it: it is the console of a standalone `abstractcore serve`, and the gateway's terminal console already has its Models and Engines screens | 0.7.0 |
4755
4772
  | Gateway terminal console | built by the installer (`--no-console` skips it), or `cargo install abstractgateway-console` (Rust 1.87+); then `abstractgateway-console --gateway-url http://127.0.0.1:8080 --token <admin token>` | 0.14.0 |
4756
- | Flow Editor | the console's **Apps** page (opens at `/apps/flow/`), or on its own: `npx @abstractframework/flow --gateway-url <url>` | 0.6.0 |
4757
- | Code Web UI | the console's **Apps** page (`/apps/code/`), or `npx @abstractframework/code --gateway-url <url>` | 0.9.0 |
4758
- | Observer | the console's **Apps** page (`/apps/observer/`), or `npx @abstractframework/observer --gateway-url <url>` | 0.5.0 |
4773
+ | Flow Editor | the console's **Apps** page (opens at `/apps/flow/`), or on its own: `npx @abstractframework/flow --gateway-url <url>` | 0.7.0 |
4774
+ | Code Web UI | the console's **Apps** page (`/apps/code/`), or `npx @abstractframework/code --gateway-url <url>` | 0.10.0 |
4775
+ | Observer | the console's **Apps** page (`/apps/observer/`), or `npx @abstractframework/observer --gateway-url <url>` | 0.6.0 |
4759
4776
  | Continuum console | the console's **Apps** page (`/apps/continuum/`), or `npx @abstractframework/continuum --gateway-url <url>` | 0.6.0 |
4760
- | Entity manager | the console's **Apps** page (`/apps/entity/`), or `npx @abstractframework/entity --gateway-url <url>` | 0.5.0 |
4777
+ | Entity manager | the console's **Apps** page (`/apps/entity/`), or `npx @abstractframework/entity --gateway-url <url>` | 0.6.0 |
4761
4778
  | AbstractCode terminal client | `cargo install abstractcode`, or a prebuilt binary from the [AbstractCode GitHub release](https://github.com/lpalbou/AbstractCode/releases) | 0.8.0 |
4762
4779
 
4763
4780
  The browser apps need a running gateway. The gateway installs, starts and serves them itself, on
@@ -6749,14 +6766,14 @@ The response type returned by `llm.generate(...)`.
6749
6766
 
6750
6767
  ### `__version__`
6751
6768
 
6752
- The meta-package version (`0.9.0` for this release).
6769
+ The meta-package version (`0.9.1` for this release).
6753
6770
 
6754
6771
  ### `RELEASE_VERSIONS`
6755
6772
 
6756
- Dictionary mapping each ecosystem package name to the pinned version for this release. In 0.8.0:
6757
- `abstractcore` 2.22.0, `abstractruntime` 0.8.2, `abstractagent` 0.3.17, `abstractgateway` 0.10.0,
6773
+ Dictionary mapping each ecosystem package name to the pinned version for this release. In 0.9.1:
6774
+ `abstractcore` 2.23.0, `abstractruntime` 0.8.3, `abstractagent` 0.3.17, `abstractgateway` 0.11.1,
6758
6775
  `abstractskill` 0.3.0, `abstractmemory` 0.3.0, `abstractsemantics` 0.0.5, `abstractvoice` 0.13.2, `abstractvision` 0.3.33,
6759
- `abstractmusic` 0.1.15, `abstract3d` 0.3.2, `abstractassistant` 0.11.0.
6776
+ `abstractmusic` 0.1.15, `abstract3d` 0.3.2, `abstractassistant` 0.12.0.
6760
6777
 
6761
6778
  ### `PACKAGE_DISTRIBUTIONS`
6762
6779
 
@@ -6766,9 +6783,9 @@ Maps each package name in `RELEASE_VERSIONS` to its PyPI distribution name (for
6766
6783
  ### `NPM_RELEASE_VERSIONS`
6767
6784
 
6768
6785
  The npm apps released with this version, each runnable with `npx <package>`:
6769
- `@abstractframework/flow` 0.6.0, `@abstractframework/code` 0.9.0,
6770
- `@abstractframework/observer` 0.5.0, `@abstractframework/continuum` 0.6.0 and
6771
- `@abstractframework/entity` 0.5.0. They also appear as `npm_apps` in the install manifest.
6786
+ `@abstractframework/flow` 0.7.0, `@abstractframework/code` 0.10.0,
6787
+ `@abstractframework/observer` 0.6.0, `@abstractframework/continuum` 0.6.0 and
6788
+ `@abstractframework/entity` 0.6.0. They also appear as `npm_apps` in the install manifest.
6772
6789
 
6773
6790
  ### `CRATE_RELEASE_VERSIONS`
6774
6791
 
@@ -185,7 +185,7 @@ Notes for LLMs working in this repo:
185
185
  - [abstractframework/__init__.py](abstractframework/__init__.py): `RELEASE_VERSIONS`, `NPM_RELEASE_VERSIONS`, `CRATE_RELEASE_VERSIONS`, `get_release_profile()`, `print_status()`.
186
186
  - [docs/installers/install-manifest.json](docs/installers/install-manifest.json): Generated install manifest, schema v2 (pins, profiles, npm apps, `bootstrap` gateway pin/scripts/flags, console-first `post_install`).
187
187
  - [scripts/install.sh](scripts/install.sh) / [scripts/install.ps1](scripts/install.ps1): The bootstrap installers.
188
- - abstractframework 0.8.0 pins (PyPI, `==`): abstractgateway 0.10.0, abstractassistant 0.11.0, abstractcore 2.22.0, AbstractRuntime 0.8.2, abstractagent 0.3.17, abstractskill 0.3.0, AbstractMemory 0.3.0, abstractsemantics 0.0.5, abstractvoice 0.13.2, abstractvision 0.3.33, abstractmusic 0.1.15, abstract3d 0.3.2.
188
+ - abstractframework 0.9.1 pins (PyPI, `==`): abstractgateway 0.11.1, abstractassistant 0.12.0, abstractcore 2.23.0, AbstractRuntime 0.8.3, abstractagent 0.3.17, abstractskill 0.3.0, AbstractMemory 0.3.0, abstractsemantics 0.0.5, abstractvoice 0.13.2, abstractvision 0.3.33, abstractmusic 0.1.15, abstract3d 0.3.2.
189
189
  - Released with it: npm `@abstractframework/flow` 0.6.0, `code` 0.9.0, `observer` 0.5.0, `continuum` 0.6.0, `entity` 0.5.0 (opened through the gateway at `/apps/<app>/`, or run with `npx`); crates (`CRATE_RELEASE_VERSIONS`) `abstractgateway-console` 0.13.0 (built by the installer by default), `abstractcore-console` 0.6.0, `abstractcode` 0.8.0, `abstracttui` 0.6.0; images `ghcr.io/lpalbou/abstractgateway:0.10.0`, `ghcr.io/lpalbou/abstractcore-server:2.22.0`.
190
190
  - Profiles: light (remote-only), apple (`abstractframework[apple]`, macOS 14+ Apple Silicon), gpu (`abstractframework[gpu]`); Python 3.10-3.13 (F5-TTS voice cloning in apple/gpu needs 3.11+).
191
191
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "abstractframework"
7
- version = "0.9.0"
7
+ version = "0.9.1"
8
8
  description = "Unified installer and documentation hub for the AbstractFramework ecosystem"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -48,7 +48,7 @@ requires-python = ">=3.10"
48
48
  # - Keep the meta-package aligned with the real per-package profiles (especially `abstractgateway`).
49
49
  dependencies = [
50
50
  # Durable Gateway control plane (remote-light by default).
51
- "abstractgateway==0.11.0",
51
+ "abstractgateway==0.11.1",
52
52
 
53
53
  # Workflow authoring UI is distributed through npm as @abstractframework/flow.
54
54
  "abstractassistant==0.12.0",
@@ -82,12 +82,12 @@ dependencies = [
82
82
  # the stack by selecting the hardware-local dependency aggregates (owned by Gateway),
83
83
  # then adds user-facing apps.
84
84
  apple = [
85
- "abstractgateway[apple]==0.11.0",
85
+ "abstractgateway[apple]==0.11.1",
86
86
  "abstractassistant[apple]==0.12.0; platform_system == \"Darwin\"",
87
87
  ]
88
88
 
89
89
  gpu = [
90
- "abstractgateway[gpu]==0.11.0",
90
+ "abstractgateway[gpu]==0.11.1",
91
91
  "abstractassistant[gpu]==0.12.0",
92
92
  ]
93
93