arbora 0.1.8.dev10__tar.gz → 0.1.8.dev12__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.
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/PKG-INFO +1 -1
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/_version.py +1 -1
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/fleet.py +19 -0
- arbora-0.1.8.dev12/arbora/fleet/catalog_composition.py +277 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/catalog_reader.py +76 -16
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/gateway_ops.py +6 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/multiplexer.py +114 -23
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/multiplexer_ops.py +48 -7
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/fleet_composition.py +4 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora.egg-info/PKG-INFO +1 -1
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_fleet_catalog_reader.py +64 -0
- arbora-0.1.8.dev10/arbora/fleet/catalog_composition.py +0 -187
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/LICENSE +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/README.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/admission.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/anonymous.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/anonymous_native.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/anonymous_send.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/application.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/approval.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/authority.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/composition.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/mcp.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/routing.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/run_usage.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/sdk_app.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/terminal_event.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/tool_task.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/tool_task_dispatch.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/tool_task_requests.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/a2a/work_items.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/access/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/access/action_policy.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/access/action_policy_source.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/access/approval.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/access/assurance.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/access/external_policy_sync.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/access/host_start.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/access/priority.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/access/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/access/task_guard.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/acp/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/acp/adapter.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/acp/central_runtime.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/acp/coding_session.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/acp/http_transport.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/acp/local_history.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/acp/local_runtime.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/acp/session_policy.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/acp/stdio_transport.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/agent_host/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/agent_host/log_access.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/agent_host/log_replay.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/agent_host/log_routes.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/agent_host/log_runtime.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/agent_host/log_sink.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/agent_host/managed_web.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/agent_host/start_admission.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/agent_host/start_configuration.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/agent_runs.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/contracts/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/contracts/agent_control_contracts.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/contracts/agent_control_plane.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/contracts/catalog.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/contracts/messaging.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/contracts/provisioning.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/contracts/session.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/engine_errors.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/errors.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/evidence/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/evidence/bundle.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/evidence/contradiction.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/http/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/http/app.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/http/auth.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/http/browser_app.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/http/browser_auth.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/http/checkout.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/http/openapi.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/http/protocol_routes.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/http/routes.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/invoke/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/invoke/audit.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/invoke/bootstrap.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/invoke/eg_audit.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/invoke/executor.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/invoke/pipeline.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/invoke/plan.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/invoke/steps.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/mcp/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/mcp/caller.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/mcp/discovery.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/mcp/registration.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/mcp/resolve.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/mcp/resources.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/mcp/serving.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/mcp/verbs.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/_common.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/access.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/agents.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/browser.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/capacity.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/decide.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/federation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/fleet_deploy_watch.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/ingest.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/memory.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/messaging.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/ops.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/plans.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/policy.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/query.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/query_engine.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/query_federation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/registry_factory.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/research.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/retrieval.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/run_graph.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/run_replay.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/runs.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/security.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/source.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/swarm.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/telemetry.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/usage.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/work.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/write_back.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/ops/write_back_models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/policy/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/policy/cache.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/policy/default_policy.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/policy/defaults.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/policy/domain_scopes.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/policy/eunomia.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/policy/pdp_remote.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/registry/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/registry/digest.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/registry/eg_binding.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/registry/eg_exclusions.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/registry/registry.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/registry/scopes.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/registry/spec.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/registry/surface_gate.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/api/task_plan_schema.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/architecture/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/architecture/boundary_census.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/architecture/capability_layers.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_api.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_attendance.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_attendance_api.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_attended.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_binding.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_cancellation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_channel.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_client.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_common.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_descriptor.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_dispatch.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_durability.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_lease.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_outcome.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_policy.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_port.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_proposals.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_provenance.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_registration.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_runtime.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_server.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_state.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_validation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/mcp.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/browser_control/trace_bundle.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/certification/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/certification/oidc.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/client/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/client/_models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/client/browser_boundary.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/client/http.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/client/invoke.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/connector_runner.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/console.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/content.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/_model.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/admission/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/admission/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/admission/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/agents/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/agents/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/agents/repository.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/agents/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/connectors/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/connectors/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/connectors/repository.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/connectors/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/economics/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/economics/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/economics/repository.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/economics/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/fleet_watch/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/fleet_watch/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/foundation/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/foundation/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/foundation/repository.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/foundation/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/migrations/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/migrations/authority.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/migrations/errors.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/migrations/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/policy/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/policy/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/policy/repository.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/projection/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/projection/authority.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/projection/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/projection/observability.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/projection/projector.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/projection/protocols.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/projection/repository.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/retrieval/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/retrieval/errors.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/retrieval/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/retrieval/protocols.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/retrieval/repository.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/retrieval/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/runs/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/runs/admission.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/runs/audit.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/runs/capacity.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/runs/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/runs/observations.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/sources/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/sources/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/sources/repository.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/sources/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/webui/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/webui/errors.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/webui/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/webui/protocols.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/webui/repository.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/webui/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/workflows/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/workflows/domain.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/control_plane/workflows/repository.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/core/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/core/agent_config_admin.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/core/capability_contract.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/core/config_admin.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/core/event_loop.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/core/provider_materialization.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/core/providers.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/core/settings.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/core/transport.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/current_plan_publication.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/data_migrations.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/certification_assets.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/cli.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/config_generator.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/doctor.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/doctor_certification.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/doctor_coverage.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/doctor_graph.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/doctor_lakehouse.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/doctor_observability.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/doctor_support.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/engine_lock.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/exit_criteria.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/file_lock.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/genesis_environments.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/host_config.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/host_lock.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/kubernetes_first_boot.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/live_mount_guard.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/local_gates.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/preflight.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/production_ops.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/profile_guard.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/public_ingress_identity.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/release_canary.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/release_candidate.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/repo_templates.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/self_deploy.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/semantic_provisioning.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/venv_autosync.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/venv_sync.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/venv_sync_types.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/deployment/webui_reference_model.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/ecosystem/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/ecosystem/agent_manager_dashboard.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/ecosystem/ard_federation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/ecosystem/ard_registry.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/ecosystem/ard_signing.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/ecosystem/hook_installer.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/epistemic.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/evolution/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/evolution/wiring_sweep.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/finance/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/finance/alerts.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/finance/dca.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/finance/markets.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/finance/schedule.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/access_contracts.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/catalog_graph.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/catalog_items.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/catalog_sources.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/child_resilience.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/client_toolsets.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/connector_count_pins.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/coverage.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/declarations.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/discovery_authority.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/epistemic_adapter.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/error_budget.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/feeds.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/health.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/local_skill_catalog.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/mcp_resource_reconciliation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/onboarding.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/pin_store.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/plan_confirmation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/protocol_compat.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/scaling/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/scaling/_model.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/scaling/development_lane.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/scaling/resource_pool_authority.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/scaling/resource_reservation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/scaling/scaling_authority.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/scaling/scaling_intent_reconciler.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/scaling/scaling_signal_authority.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/scaling/service_scale_units.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/service_child.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/session_loads.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/session_notifications.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/shared_multiplexer.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/source_executor.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/surfaces.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/throttle_service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet/virtual_catalog.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/fleet_tool_call.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/aggregator.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/config.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/daemon.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/dashboard_api.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/enhanced_catalog_api.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/fleet.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/fleet_events.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/graph_api.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/ontology_api.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/ports.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/rate_limit.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/registry.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/registry_api.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/remote_oauth_api.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/schema_context_api.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/schema_context_service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/schemas/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/schemas/connector.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/schemas/graph_core.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/schemas/schema_context.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/ansible_tower.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/archivebox.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/aris.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/arr.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/atlassian.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/audio_transcriber.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/audiobookshelf.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/base.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/caddy.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/camunda.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/ciso_assistant.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/clarity.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/container_manager.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/data_science.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/dockerhub.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/documentdb.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/ear.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/egeria.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/emerald_exchange.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/erpnext.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/fan_manager.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/firefly_iii.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/fleet_client.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/freshrss.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/github.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/gitlab.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/google_workspace.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/gramps.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/hdhomerun.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/home_assistant.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/jellyfin.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/jena.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/kafka.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/keycloak.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/langfuse.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/leanix.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/legal_peripherals.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/lgtm.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/listmonk.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/mattermost.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/mealie.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/media_downloader.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/microsoft.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/nextcloud.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/okta.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/ollama.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/onetrust.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/openbao.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/orchestrator.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/owncast.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/paperless_ngx.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/plane.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/portainer.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/postiz.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/pulselink.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/qbittorrent.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/repository_manager.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/rom_manager.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/scholarx.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/searxng.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/sentry.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/servicenow.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/stirlingpdf.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/systems_manager.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/technitium.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/teleport.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/tunnel_manager.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/twenty.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/uptime_kuma.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/vector_db.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/wger.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/gateway/widgets/zulip.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/host_bindings.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/admin_console.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/admission.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/api_keys.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/approval.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/approval_engine.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/approval_registration.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/bootstrap.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/broker.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/browser.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/browser_broker.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/browser_composition.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/browser_runtime.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/client_entry_points.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/composition.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/engine.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/engine_ports.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/issuer.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/ldap.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/local_browser.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/mail_capability.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/mfa.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/oidc.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/ports.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/saml.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/identity/scim.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/ingest/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/ingest/connector_sources.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/ingest/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/ingest/source_catalog.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/local_browser_boundary.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/local_browser_channel.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/agent_control.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/arbora_operations.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/_arbora_action_manifest.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/action_dispatch.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/arbora_capabilities.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/arbora_surface.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/client_credentials.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/concurrency.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/connector_surface.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/context_helpers.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/delegated_auth.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/engine_routing.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/engine_surface_types.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/eunomia_principal.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/httpx_boundary.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/intent_contract.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/middlewares.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/oauth_log_hygiene.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/ontology_types.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/optional_tool_features.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/remote_oauth_broker.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/server_factory.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/skill_coverage.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tasks_extension.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tool_specs.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/_surface_selection.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/analysis_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/analyze_suite.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/audit_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/candidate_claim_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/compliance_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/config_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/domain_ops_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/engine_surface_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/engine_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/epistemic_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/governance_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/graph_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/intent_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/mcp_apps.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/ontology_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/query_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/reach_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/secret_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/state_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/write_ingest_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/verbose_tools.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/write_ingest_types.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/bootstrap.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/browser_dispatch.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/browser_state.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/catalog_composition.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/composition.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/current_plan_reader.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/decide_wiring.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/effect_journal.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/harness_host.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/hosted_invocation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/legacy_action_mapping.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/operation_registry.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/routes.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/run_reader.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/runtime.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/served_engine.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/served_invocation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/server.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/source_reader.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/task_plan.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/mcp_server/task_plan_runtime.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/action_dispatch.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/alert_intake.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/discord.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/googlechat.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/googlemeet.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/imessage.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/irc.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/line.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/matrix.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/mattermost.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/nextcloud.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/signal.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/slack.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/synology.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/teams.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/telegram.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/twitch.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/voicecall.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/backends/whatsapp.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/base.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/capabilities.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/coalescer.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/commands.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/governed_send.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/host_ports.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/inbox.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/intake.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/lease.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/models.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/planner_handler.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/polling.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/reach.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/registry.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/render.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/router.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/supervision.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/messaging/transport.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/native_run_admission.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/correlation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/custom_observability.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/error_detail_sink.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/gateway_health.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/gateway_metrics.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/health.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/langfuse_exporter.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/langfuse_trust.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/readiness.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/runtime_health.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/runtime_signals.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/subsystem_health.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/telemetry.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/observability/trace_ontology.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/ontology/shapes/runtime.shapes.ttl +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-01.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-02.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-03.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-04.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-05.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-06.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-07.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-08.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-09.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-10.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-a.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-b.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-c.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-d1.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-d10.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-d2.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-d3.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-d4.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-d5.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-d6.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-d7.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-d8.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/cq-d9.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/delegation-cycle-refused.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/delegation-fan-out.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/delegation-gitlab-servicenow-plane.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/delegation-ordered-dag.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/delegation-plan-persisted.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/prompts/incident-triage-system.json +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/run_origin.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/actor_context.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/anonymous.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/auth.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/config_sensitivity.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/conformance/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/conformance/surface_inventory.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/conformance/surface_manifest.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/delegation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/elevation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/error_surface.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/http_boundary.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/identifiers.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/identity.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/log_redaction.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/oidc_discovery.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/operation_result.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/prompt_injection.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/request_identity.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/run_authority.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/run_token.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/scope_registry.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/secrets.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/security_policy_middleware.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/security/settings.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/semantic_content.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/agent-utilities-source-integration/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/agent-utilities-source-integration/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/agent-utilities-source-integration/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/references/first-boot-verification.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/references/fleet-and-control-plane.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/references/identity-and-access.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/references/secrets-and-federation.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/references/telemetry.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-development/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-development/references/bootstrap.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-evolution/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-evolution/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-evolution/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/TROUBLESHOOTING.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/bare-metal.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/compose-and-podman.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/data-plane-substrate.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/deployment-contract.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/development-workspace.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/docker-swarm.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/engine-identity-admission.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/kubernetes-and-helm.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/orchestrator-migration-cutover.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/runtime-topology.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/security-and-operations.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/arbora-repository-development/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/autonomous-contribution/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/autonomous-contribution/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/autonomous-contribution/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/core-pack.txt +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-engine-and-modalities/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-engine-and-modalities/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-engine-and-modalities/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-ingestion-and-integration/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-ingestion-and-integration/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-ingestion-and-integration/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-ingestion-and-integration/references/ingest-connector-reference.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-ingestion-and-integration/references/ingest_manifest.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-modeling-and-mutation/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-modeling-and-mutation/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-modeling-and-mutation/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-orchestration-and-automation/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-orchestration-and-automation/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-orchestration-and-automation/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-query-and-explanation/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-query-and-explanation/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-query-and-explanation/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-query-and-explanation/references/uql-reference.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-research-and-analysis/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-research-and-analysis/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-research-and-analysis/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-runtime-and-governance/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-runtime-and-governance/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/graph-runtime-and-governance/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/skills/using-arbora/SKILL.md +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/unique_records.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/webui_host/__init__.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/webui_host/contact_delivery.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/webui_host/contact_governance.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/webui_host/mcp_delegation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/webui_host/package_layout_expectation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/webui_host/session_boundary.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/webui_host/voice_delegation.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/webui_host/webui_co_service.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora/work_items.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora.egg-info/SOURCES.txt +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora.egg-info/dependency_links.txt +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora.egg-info/entry_points.txt +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora.egg-info/requires.txt +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/arbora.egg-info/top_level.txt +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/pyproject.toml +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/setup.cfg +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_a2a_extension_lifespan.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_agent_runs.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_agents_run_end_to_end.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_boot_diagnostics.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_check_acceptance_evidence.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_check_connector_count_pins.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_check_core_skills.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_check_wiring.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_component_registry_boundary_seeds.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_connector_pack_typed_publisher.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_connector_runner_composition.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_current_plan_publication.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_data_migrations.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_dependency_manifest.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_docs_surface.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_epistemic_adapter.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_epistemic_loop_lifecycle.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_host_bindings.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_installed_content.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_native_run_admission.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_native_run_scope.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_package_layout.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_persisted_shapes.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_real_anonymous_boot.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_real_boot.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_real_boot_messaging.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_real_boot_ports.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_real_boot_read_assertions.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_run_event_payloads.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_run_origin.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_semantic_content.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_served_engine_native_labels.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_served_operation_api.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_unique_records.py +0 -0
- {arbora-0.1.8.dev10 → arbora-0.1.8.dev12}/tests/test_work_items.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: arbora
|
|
3
|
-
Version: 0.1.8.
|
|
3
|
+
Version: 0.1.8.dev12
|
|
4
4
|
Summary: The deployable MCP, REST, control-plane, fleet, WebUI, and operations composition for the Knuckles agent platform.
|
|
5
5
|
Author-email: Repository Maintainers <maintainers@knuckles.team>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -105,6 +105,10 @@ class FleetPinsListParams(_Params):
|
|
|
105
105
|
limit: int = Field(default=50, ge=1, le=100)
|
|
106
106
|
|
|
107
107
|
|
|
108
|
+
class FleetCatalogRefreshParams(_Params):
|
|
109
|
+
servers: tuple[str, ...] = Field(min_length=1, max_length=32)
|
|
110
|
+
|
|
111
|
+
|
|
108
112
|
class FleetCallParams(_Params):
|
|
109
113
|
server: str = Field(min_length=1, max_length=128)
|
|
110
114
|
tool: str = Field(min_length=1, max_length=128)
|
|
@@ -191,6 +195,8 @@ async def handle_fleet_operation(
|
|
|
191
195
|
result = await gateway.pin(caller, **params)
|
|
192
196
|
elif op.id == "fleet.tools.unpin":
|
|
193
197
|
result = await gateway.unpin(caller, **params)
|
|
198
|
+
elif op.id == "fleet.catalog.refresh":
|
|
199
|
+
result = await gateway.catalog_refresh(caller, **params)
|
|
194
200
|
elif op.id == "fleet.pins.list":
|
|
195
201
|
result = await gateway.pins_list(caller, **params)
|
|
196
202
|
elif op.id == "fleet.prompts.list":
|
|
@@ -359,6 +365,18 @@ def operations() -> tuple[OpSpec, ...]:
|
|
|
359
365
|
),
|
|
360
366
|
)
|
|
361
367
|
),
|
|
368
|
+
OpSpec(
|
|
369
|
+
id="fleet.catalog.refresh",
|
|
370
|
+
verb=Verb.MANAGE,
|
|
371
|
+
summary="Re-read connector tool catalogs now, without an arbora restart",
|
|
372
|
+
examples=("refresh the tool catalog of craft-suite-api",),
|
|
373
|
+
params=FleetCatalogRefreshParams,
|
|
374
|
+
result=FleetResult,
|
|
375
|
+
binding=Composite(handler="arbora.api.ops.fleet.handle_fleet_operation"),
|
|
376
|
+
scopes=frozenset({"fleet:control"}),
|
|
377
|
+
effect=Effect.WRITE,
|
|
378
|
+
audit=AuditClass.EVENT,
|
|
379
|
+
),
|
|
362
380
|
OpSpec(
|
|
363
381
|
id="fleet.pins.list",
|
|
364
382
|
verb=Verb.ASK,
|
|
@@ -462,6 +480,7 @@ specs = operations
|
|
|
462
480
|
__all__ = [
|
|
463
481
|
"FleetCallParams",
|
|
464
482
|
"FleetCatalogParams",
|
|
483
|
+
"FleetCatalogRefreshParams",
|
|
465
484
|
"FleetLoadParams",
|
|
466
485
|
"FleetPackStatusParams",
|
|
467
486
|
"FleetPinParams",
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"""Bind the existing EG reader and multiplexer cache to fleet operations."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import logging
|
|
7
|
+
import time
|
|
8
|
+
from collections.abc import Awaitable, Callable, Iterable, Mapping
|
|
9
|
+
from typing import Any, Protocol, cast
|
|
10
|
+
|
|
11
|
+
from arbora.fleet.catalog_items import CatalogItem, FleetCatalog
|
|
12
|
+
from arbora.fleet.catalog_sources import CombinedFleetSource, SdkRead
|
|
13
|
+
from arbora.fleet.multiplexer_ops import (
|
|
14
|
+
CoverageEndpoints,
|
|
15
|
+
CoverageRegistry,
|
|
16
|
+
Invoke,
|
|
17
|
+
Loadable,
|
|
18
|
+
Mount,
|
|
19
|
+
MultiplexerOps,
|
|
20
|
+
NativeName,
|
|
21
|
+
Notify,
|
|
22
|
+
ReadItem,
|
|
23
|
+
SessionKeyFor,
|
|
24
|
+
UnadmittedServers,
|
|
25
|
+
)
|
|
26
|
+
from arbora.fleet.pin_store import PinStore
|
|
27
|
+
from arbora.fleet.session_loads import SessionLoads
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class VerifiedReader(Protocol):
|
|
33
|
+
async def read(self) -> Any: ...
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class CachedProbe(Protocol):
|
|
37
|
+
_probe_cache: Mapping[str, Mapping[str, Any]]
|
|
38
|
+
|
|
39
|
+
def status_snapshot(self) -> Mapping[str, Any]: ...
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
async def _cached_protocol(mux: CachedProbe) -> Mapping[str, Mapping[str, Any]]:
|
|
43
|
+
"""Use completed probes only; discovery never starts a fleet sweep here."""
|
|
44
|
+
return dict(mux._probe_cache)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
#: A server whose probe failed or is never cached (an OAuth-gated child) is
|
|
48
|
+
#: not re-probed before this many seconds. A cached probe that is later
|
|
49
|
+
#: invalidated is re-probed on the next request. An explicit refresh of one
|
|
50
|
+
#: server runs at most once per window too.
|
|
51
|
+
PRIME_RETRY_S = 60.0
|
|
52
|
+
#: One server's priming probe may take at most this long.
|
|
53
|
+
PRIME_TIMEOUT_S = 20.0
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _good(info: Mapping[str, Any] | None) -> bool:
|
|
57
|
+
return isinstance(info, Mapping) and info.get("error") is None
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _summary(info: Mapping[str, Any] | None) -> dict[str, Any]:
|
|
61
|
+
"""The caller-visible outcome of one refresh: a count, never the tools."""
|
|
62
|
+
if not isinstance(info, Mapping):
|
|
63
|
+
return {"tools": 0, "error": "refresh failed"}
|
|
64
|
+
return {
|
|
65
|
+
"tools": len(info.get("tools") or ()),
|
|
66
|
+
"error": info.get("error"),
|
|
67
|
+
"probed_at": info.get("probed_at"),
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class ProbePrimer:
|
|
72
|
+
"""Keep the probed half of the fleet catalog current.
|
|
73
|
+
|
|
74
|
+
The verified EG catalog carries no input schema or tool annotations; the
|
|
75
|
+
live probe does. Calling the primer probes only the servers a request
|
|
76
|
+
names, so the served path never sweeps the fleet. A probe past the
|
|
77
|
+
multiplexer's TTL is served while one background re-probe runs
|
|
78
|
+
(ARBORA-FLEET-R070), and :meth:`refresh` re-reads a server at once, for a
|
|
79
|
+
``fleet.call`` of a tool the catalog does not know yet (ARBORA-FLEET-R071)
|
|
80
|
+
and for the explicit refresh operation. A failed re-probe is logged and
|
|
81
|
+
leaves the last good probe in place.
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
def __init__(
|
|
85
|
+
self,
|
|
86
|
+
mux: Any,
|
|
87
|
+
*,
|
|
88
|
+
retry_s: float = PRIME_RETRY_S,
|
|
89
|
+
timeout_s: float = PRIME_TIMEOUT_S,
|
|
90
|
+
clock: Callable[[], float] = time.monotonic,
|
|
91
|
+
) -> None:
|
|
92
|
+
self._mux = mux
|
|
93
|
+
self._probe = getattr(mux, "probe_server", None)
|
|
94
|
+
self._retry_s = retry_s
|
|
95
|
+
self._timeout_s = timeout_s
|
|
96
|
+
self._clock = clock
|
|
97
|
+
self._attempted: dict[str, float] = {}
|
|
98
|
+
self._refreshed: dict[str, float] = {}
|
|
99
|
+
self._locks: dict[str, asyncio.Lock] = {}
|
|
100
|
+
self._background: dict[str, asyncio.Task[Any]] = {}
|
|
101
|
+
|
|
102
|
+
def _throttled(self, stamps: Mapping[str, float], server: str) -> bool:
|
|
103
|
+
last = stamps.get(server)
|
|
104
|
+
return last is not None and self._clock() - last < self._retry_s
|
|
105
|
+
|
|
106
|
+
def _fresh(self, server: str) -> bool:
|
|
107
|
+
if not _good(self._mux._probe_cache.get(server)):
|
|
108
|
+
return False
|
|
109
|
+
hit = getattr(self._mux, "_probe_cache_hit", None)
|
|
110
|
+
return hit is None or hit(server) is not None
|
|
111
|
+
|
|
112
|
+
def _keep_last_good(self, server: str, previous: Any) -> None:
|
|
113
|
+
if _good(previous) and not _good(self._mux._probe_cache.get(server)):
|
|
114
|
+
logger.warning("fleet re-probe of %s failed; keeping its catalog", server)
|
|
115
|
+
self._mux._probe_cache[server] = previous
|
|
116
|
+
|
|
117
|
+
async def _probe_once(self, server: str, *, force: bool) -> Any:
|
|
118
|
+
"""Probe one server; a good cached result clears its retry window."""
|
|
119
|
+
probe = cast(Callable[..., Awaitable[Any]], self._probe)
|
|
120
|
+
previous = self._mux._probe_cache.get(server)
|
|
121
|
+
self._attempted[server] = self._clock()
|
|
122
|
+
run = probe(server, force=True) if force else probe(server)
|
|
123
|
+
try:
|
|
124
|
+
info = await asyncio.wait_for(run, timeout=self._timeout_s)
|
|
125
|
+
except Exception as exc: # noqa: BLE001 - priming is best-effort
|
|
126
|
+
logger.warning(
|
|
127
|
+
"fleet probe of %s for catalog schema failed: %s",
|
|
128
|
+
server,
|
|
129
|
+
type(exc).__name__,
|
|
130
|
+
)
|
|
131
|
+
info = None
|
|
132
|
+
self._keep_last_good(server, previous)
|
|
133
|
+
if _good(self._mux._probe_cache.get(server)):
|
|
134
|
+
# The window throttles failed and never-cached probes only.
|
|
135
|
+
# A cached probe that a later schema refresh drops must be
|
|
136
|
+
# re-primed on the next request, or its tools lose their
|
|
137
|
+
# annotations and a read-only tool resolves as a write.
|
|
138
|
+
self._attempted.pop(server, None)
|
|
139
|
+
return info
|
|
140
|
+
|
|
141
|
+
def _lock(self, server: str) -> asyncio.Lock:
|
|
142
|
+
return self._locks.setdefault(server, asyncio.Lock())
|
|
143
|
+
|
|
144
|
+
async def _reprobe_stale(self, server: str) -> None:
|
|
145
|
+
async with self._lock(server):
|
|
146
|
+
if not self._fresh(server):
|
|
147
|
+
await self._probe_once(server, force=False)
|
|
148
|
+
|
|
149
|
+
def _refresh_in_background(self, server: str) -> None:
|
|
150
|
+
task = self._background.get(server)
|
|
151
|
+
if (task is not None and not task.done()) or self._throttled(
|
|
152
|
+
self._attempted, server
|
|
153
|
+
):
|
|
154
|
+
return
|
|
155
|
+
self._background[server] = asyncio.ensure_future(self._reprobe_stale(server))
|
|
156
|
+
|
|
157
|
+
async def __call__(self, servers: Iterable[str]) -> None:
|
|
158
|
+
if self._probe is None:
|
|
159
|
+
return
|
|
160
|
+
for server in _named(servers):
|
|
161
|
+
if self._fresh(server):
|
|
162
|
+
continue
|
|
163
|
+
if _good(self._mux._probe_cache.get(server)):
|
|
164
|
+
self._refresh_in_background(server)
|
|
165
|
+
continue
|
|
166
|
+
async with self._lock(server):
|
|
167
|
+
if _good(self._mux._probe_cache.get(server)) or self._throttled(
|
|
168
|
+
self._attempted, server
|
|
169
|
+
):
|
|
170
|
+
continue
|
|
171
|
+
await self._probe_once(server, force=False)
|
|
172
|
+
|
|
173
|
+
async def refresh(self, servers: Iterable[str]) -> dict[str, dict[str, Any]]:
|
|
174
|
+
"""Re-probe each named server now, at most once per retry window."""
|
|
175
|
+
outcome: dict[str, dict[str, Any]] = {}
|
|
176
|
+
if self._probe is None:
|
|
177
|
+
return outcome
|
|
178
|
+
for server in _named(servers):
|
|
179
|
+
async with self._lock(server):
|
|
180
|
+
info: Any = self._mux._probe_cache.get(server)
|
|
181
|
+
if not self._throttled(self._refreshed, server):
|
|
182
|
+
self._refreshed[server] = self._clock()
|
|
183
|
+
info = await self._probe_once(server, force=True)
|
|
184
|
+
info = self._mux._probe_cache.get(server, info)
|
|
185
|
+
outcome[server] = _summary(info)
|
|
186
|
+
return outcome
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _named(servers: Iterable[str]) -> list[str]:
|
|
190
|
+
return [server for server in servers if isinstance(server, str) and server]
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def probe_primer(
|
|
194
|
+
mux: Any,
|
|
195
|
+
*,
|
|
196
|
+
retry_s: float = PRIME_RETRY_S,
|
|
197
|
+
timeout_s: float = PRIME_TIMEOUT_S,
|
|
198
|
+
clock: Callable[[], float] = time.monotonic,
|
|
199
|
+
) -> ProbePrimer:
|
|
200
|
+
"""The primer for one multiplexer; see :class:`ProbePrimer`."""
|
|
201
|
+
return ProbePrimer(mux, retry_s=retry_s, timeout_s=timeout_s, clock=clock)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def compose_multiplexer_ops(
|
|
205
|
+
*,
|
|
206
|
+
reader: VerifiedReader,
|
|
207
|
+
mux: CachedProbe,
|
|
208
|
+
sdk_entries: SdkRead,
|
|
209
|
+
visible: Callable[[CatalogItem, Any], Awaitable[bool]],
|
|
210
|
+
loadable: Loadable,
|
|
211
|
+
callable_item: Loadable,
|
|
212
|
+
mount: Mount,
|
|
213
|
+
notify: Notify,
|
|
214
|
+
invoke: Invoke,
|
|
215
|
+
session_key_for: SessionKeyFor,
|
|
216
|
+
native_name: NativeName | None = None,
|
|
217
|
+
read_item: ReadItem | None = None,
|
|
218
|
+
cap: int = 64,
|
|
219
|
+
pinned_cap: int | None = None,
|
|
220
|
+
idle_ttl_seconds: int = 3600,
|
|
221
|
+
pin_store: PinStore | None = None,
|
|
222
|
+
coverage_registry: CoverageRegistry | None = None,
|
|
223
|
+
coverage_endpoints: CoverageEndpoints | None = None,
|
|
224
|
+
unadmitted_servers: UnadmittedServers | None = None,
|
|
225
|
+
) -> MultiplexerOps:
|
|
226
|
+
"""Build one operation service without claiming the MCP cutover is wired.
|
|
227
|
+
|
|
228
|
+
``reader`` is the process's already-bound ``DeferredFleetCatalogReader``.
|
|
229
|
+
``mux`` is the same process singleton used by the MCP server. The
|
|
230
|
+
discovery/load-authorization policy owns ``visible``/``loadable``, and
|
|
231
|
+
the native MCP tool registration and list-changed notification path owns
|
|
232
|
+
the ``mount``/``notify`` hooks; supplying neither cannot silently widen
|
|
233
|
+
authority. ``pinned_cap`` defaults to the ``FLEET_PINNED_CAP`` setting;
|
|
234
|
+
``pin_store`` is the durable per-principal pin store (without one the pin
|
|
235
|
+
operations refuse ``UNAVAILABLE``).
|
|
236
|
+
"""
|
|
237
|
+
|
|
238
|
+
async def live() -> Mapping[str, Mapping[str, Any]]:
|
|
239
|
+
return await _cached_protocol(mux)
|
|
240
|
+
|
|
241
|
+
prime = probe_primer(mux)
|
|
242
|
+
source = CombinedFleetSource(verified=reader.read, live=live, sdk=sdk_entries)
|
|
243
|
+
catalog = FleetCatalog((source,), visible)
|
|
244
|
+
|
|
245
|
+
def health() -> Mapping[str, Any]:
|
|
246
|
+
return mux.status_snapshot().get("children", {})
|
|
247
|
+
|
|
248
|
+
if pinned_cap is None:
|
|
249
|
+
from arbora.core.settings import runtime_config
|
|
250
|
+
|
|
251
|
+
pinned_cap = runtime_config.fleet_pinned_cap
|
|
252
|
+
if unadmitted_servers is None:
|
|
253
|
+
|
|
254
|
+
def unadmitted_servers():
|
|
255
|
+
return list(mux.status_snapshot().get("unadmitted_servers", ()))
|
|
256
|
+
|
|
257
|
+
return MultiplexerOps(
|
|
258
|
+
catalog=catalog,
|
|
259
|
+
sessions=SessionLoads(
|
|
260
|
+
cap=cap, pinned_cap=pinned_cap, idle_ttl_seconds=idle_ttl_seconds
|
|
261
|
+
),
|
|
262
|
+
loadable=loadable,
|
|
263
|
+
callable_item=callable_item,
|
|
264
|
+
mount=mount,
|
|
265
|
+
notify=notify,
|
|
266
|
+
invoke=invoke,
|
|
267
|
+
health=health,
|
|
268
|
+
session_key_for=session_key_for,
|
|
269
|
+
native_name=native_name,
|
|
270
|
+
read_item=read_item,
|
|
271
|
+
prime=prime,
|
|
272
|
+
refresh=prime.refresh,
|
|
273
|
+
pin_store=pin_store,
|
|
274
|
+
coverage_registry=coverage_registry,
|
|
275
|
+
coverage_endpoints=coverage_endpoints,
|
|
276
|
+
unadmitted_servers=unadmitted_servers,
|
|
277
|
+
)
|
|
@@ -13,6 +13,7 @@ composition-root adapter.
|
|
|
13
13
|
|
|
14
14
|
from __future__ import annotations
|
|
15
15
|
|
|
16
|
+
import asyncio
|
|
16
17
|
import logging
|
|
17
18
|
import threading
|
|
18
19
|
import time
|
|
@@ -222,6 +223,19 @@ _MAX_CACHED_SNAPSHOTS: Final = 64
|
|
|
222
223
|
_MAX_CACHED_CONTENTS: Final = 50_000
|
|
223
224
|
|
|
224
225
|
|
|
226
|
+
#: A snapshot older than its TTL is still served, while one refresh runs, up
|
|
227
|
+
#: to this many TTLs old; past that a caller waits for the fresh read.
|
|
228
|
+
_STALE_SERVE_FACTOR: Final = 3.0
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _log_refresh_failure(task: asyncio.Task[Any]) -> None:
|
|
232
|
+
if task.cancelled():
|
|
233
|
+
return
|
|
234
|
+
exc = task.exception()
|
|
235
|
+
if exc is not None:
|
|
236
|
+
logger.warning("fleet catalog refresh failed: %s", type(exc).__name__)
|
|
237
|
+
|
|
238
|
+
|
|
225
239
|
class FleetCatalogReader:
|
|
226
240
|
"""Read and verify one complete Medulla-native fleet catalog snapshot."""
|
|
227
241
|
|
|
@@ -254,6 +268,10 @@ class FleetCatalogReader:
|
|
|
254
268
|
self._cache_lock = threading.Lock()
|
|
255
269
|
self._snapshots: dict[tuple[Any, ...], tuple[float, FleetCatalog]] = {}
|
|
256
270
|
self._contents: dict[tuple[Any, ...], ComponentContent] = {}
|
|
271
|
+
# One full read per key at a time, owned by the reader and shielded
|
|
272
|
+
# from its callers (ARBORA-FLEET-R067): a caller whose own deadline
|
|
273
|
+
# passes never cancels the read, so the snapshot always lands.
|
|
274
|
+
self._inflight: dict[tuple[Any, ...], asyncio.Task[FleetCatalog]] = {}
|
|
257
275
|
|
|
258
276
|
async def read(
|
|
259
277
|
self,
|
|
@@ -265,23 +283,65 @@ class FleetCatalogReader:
|
|
|
265
283
|
context = await self._port.read_context()
|
|
266
284
|
self._validate_context(context)
|
|
267
285
|
key = (context, selected_kinds)
|
|
268
|
-
if self._snapshot_ttl_s
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
286
|
+
if self._snapshot_ttl_s <= 0:
|
|
287
|
+
return await self._read_full(context, selected_kinds)
|
|
288
|
+
with self._cache_lock:
|
|
289
|
+
cached = self._snapshots.get(key)
|
|
290
|
+
age = None if cached is None else time.monotonic() - cached[0]
|
|
291
|
+
if cached is not None and age is not None and age < self._snapshot_ttl_s:
|
|
292
|
+
return cached[1]
|
|
293
|
+
refresh = self._refresh(key, context, selected_kinds)
|
|
294
|
+
if (
|
|
295
|
+
cached is not None
|
|
296
|
+
and age is not None
|
|
297
|
+
and age < self._snapshot_ttl_s * _STALE_SERVE_FACTOR
|
|
298
|
+
):
|
|
299
|
+
# Serve the last verified snapshot while one refresh runs: a full
|
|
300
|
+
# read outlasts every interactive deadline on a real fleet.
|
|
301
|
+
return cached[1]
|
|
302
|
+
return await asyncio.shield(refresh)
|
|
303
|
+
|
|
304
|
+
def _refresh(
|
|
305
|
+
self,
|
|
306
|
+
key: tuple[Any, ...],
|
|
307
|
+
context: ReadContext,
|
|
308
|
+
kinds: tuple[ComponentKind, ...],
|
|
309
|
+
) -> asyncio.Task[FleetCatalog]:
|
|
310
|
+
"""Start (or join) the one full read for ``key``; it caches on success."""
|
|
311
|
+
|
|
312
|
+
task = self._inflight.get(key)
|
|
313
|
+
if (
|
|
314
|
+
task is not None
|
|
315
|
+
and not task.done()
|
|
316
|
+
and task.get_loop() is asyncio.get_running_loop()
|
|
317
|
+
):
|
|
318
|
+
return task
|
|
319
|
+
|
|
320
|
+
async def run() -> FleetCatalog:
|
|
321
|
+
try:
|
|
322
|
+
catalog = await self._read_full(context, kinds)
|
|
323
|
+
with self._cache_lock:
|
|
324
|
+
if len(self._snapshots) >= _MAX_CACHED_SNAPSHOTS:
|
|
325
|
+
self._snapshots.clear()
|
|
326
|
+
self._snapshots[key] = (time.monotonic(), catalog)
|
|
327
|
+
return catalog
|
|
328
|
+
finally:
|
|
329
|
+
if self._inflight.get(key) is task_ref[0]:
|
|
330
|
+
self._inflight.pop(key, None)
|
|
331
|
+
|
|
332
|
+
task_ref: list[asyncio.Task[FleetCatalog]] = []
|
|
333
|
+
task = asyncio.get_running_loop().create_task(run())
|
|
334
|
+
task_ref.append(task)
|
|
335
|
+
task.add_done_callback(_log_refresh_failure)
|
|
336
|
+
self._inflight[key] = task
|
|
337
|
+
return task
|
|
338
|
+
|
|
339
|
+
async def _read_full(
|
|
340
|
+
self, context: ReadContext, kinds: tuple[ComponentKind, ...]
|
|
341
|
+
) -> FleetCatalog:
|
|
276
342
|
registrations = await self._read_servers(context)
|
|
277
|
-
components = await self._read_components(context,
|
|
278
|
-
|
|
279
|
-
if self._snapshot_ttl_s > 0:
|
|
280
|
-
with self._cache_lock:
|
|
281
|
-
if len(self._snapshots) >= _MAX_CACHED_SNAPSHOTS:
|
|
282
|
-
self._snapshots.clear()
|
|
283
|
-
self._snapshots[key] = (time.monotonic(), catalog)
|
|
284
|
-
return catalog
|
|
343
|
+
components = await self._read_components(context, kinds)
|
|
344
|
+
return await self._join(context, registrations, components)
|
|
285
345
|
|
|
286
346
|
@staticmethod
|
|
287
347
|
def _validated_kinds(kinds: Sequence[ComponentKind]) -> tuple[ComponentKind, ...]:
|
|
@@ -551,6 +551,12 @@ class FleetGateway:
|
|
|
551
551
|
caller, items=params.get("items", ())
|
|
552
552
|
)
|
|
553
553
|
|
|
554
|
+
async def catalog_refresh(self, caller: Any, **params: Any) -> Any:
|
|
555
|
+
# The op's own scopes (fleet:control) gate the pipeline.
|
|
556
|
+
return await self._catalog(caller, "fleet:control").refresh_catalog(
|
|
557
|
+
caller, servers=params.get("servers", ())
|
|
558
|
+
)
|
|
559
|
+
|
|
554
560
|
async def pins_list(self, caller: Any, **params: Any) -> Any:
|
|
555
561
|
# The op's own scopes (fleet:control, mcp:admin) gate the pipeline;
|
|
556
562
|
# the tenant-wide read needs no session of the caller's.
|