arbora 0.1.8.dev11__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.dev11 → arbora-0.1.8.dev12}/PKG-INFO +1 -1
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/_version.py +1 -1
- {arbora-0.1.8.dev11 → 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.dev11 → arbora-0.1.8.dev12}/arbora/fleet/gateway_ops.py +6 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/multiplexer.py +114 -23
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/multiplexer_ops.py +48 -7
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/fleet_composition.py +4 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora.egg-info/PKG-INFO +1 -1
- arbora-0.1.8.dev11/arbora/fleet/catalog_composition.py +0 -187
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/LICENSE +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/README.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/admission.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/anonymous.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/anonymous_native.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/anonymous_send.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/application.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/approval.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/authority.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/composition.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/mcp.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/routing.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/run_usage.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/sdk_app.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/terminal_event.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/tool_task.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/tool_task_dispatch.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/tool_task_requests.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/a2a/work_items.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/access/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/access/action_policy.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/access/action_policy_source.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/access/approval.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/access/assurance.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/access/external_policy_sync.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/access/host_start.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/access/priority.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/access/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/access/task_guard.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/acp/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/acp/adapter.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/acp/central_runtime.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/acp/coding_session.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/acp/http_transport.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/acp/local_history.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/acp/local_runtime.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/acp/session_policy.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/acp/stdio_transport.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/agent_host/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/agent_host/log_access.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/agent_host/log_replay.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/agent_host/log_routes.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/agent_host/log_runtime.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/agent_host/log_sink.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/agent_host/managed_web.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/agent_host/start_admission.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/agent_host/start_configuration.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/agent_runs.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/contracts/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/contracts/agent_control_contracts.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/contracts/agent_control_plane.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/contracts/catalog.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/contracts/messaging.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/contracts/provisioning.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/contracts/session.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/engine_errors.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/errors.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/evidence/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/evidence/bundle.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/evidence/contradiction.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/http/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/http/app.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/http/auth.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/http/browser_app.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/http/browser_auth.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/http/checkout.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/http/openapi.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/http/protocol_routes.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/http/routes.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/invoke/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/invoke/audit.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/invoke/bootstrap.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/invoke/eg_audit.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/invoke/executor.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/invoke/pipeline.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/invoke/plan.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/invoke/steps.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/mcp/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/mcp/caller.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/mcp/discovery.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/mcp/registration.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/mcp/resolve.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/mcp/resources.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/mcp/serving.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/mcp/verbs.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/_common.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/access.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/agents.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/browser.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/capacity.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/decide.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/federation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/fleet_deploy_watch.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/ingest.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/memory.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/messaging.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/ops.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/plans.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/policy.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/query.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/query_engine.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/query_federation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/registry_factory.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/research.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/retrieval.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/run_graph.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/run_replay.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/runs.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/security.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/source.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/swarm.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/telemetry.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/usage.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/work.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/write_back.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/ops/write_back_models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/policy/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/policy/cache.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/policy/default_policy.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/policy/defaults.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/policy/domain_scopes.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/policy/eunomia.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/policy/pdp_remote.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/registry/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/registry/digest.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/registry/eg_binding.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/registry/eg_exclusions.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/registry/registry.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/registry/scopes.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/registry/spec.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/registry/surface_gate.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/api/task_plan_schema.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/architecture/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/architecture/boundary_census.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/architecture/capability_layers.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_api.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_attendance.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_attendance_api.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_attended.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_binding.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_cancellation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_channel.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_client.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_common.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_descriptor.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_dispatch.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_durability.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_lease.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_outcome.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_policy.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_port.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_proposals.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_provenance.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_registration.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_runtime.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_server.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_state.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/browser_control_validation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/mcp.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/browser_control/trace_bundle.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/certification/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/certification/oidc.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/client/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/client/_models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/client/browser_boundary.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/client/http.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/client/invoke.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/connector_runner.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/console.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/content.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/_model.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/admission/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/admission/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/admission/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/agents/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/agents/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/agents/repository.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/agents/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/connectors/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/connectors/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/connectors/repository.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/connectors/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/economics/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/economics/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/economics/repository.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/economics/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/fleet_watch/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/fleet_watch/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/foundation/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/foundation/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/foundation/repository.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/foundation/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/migrations/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/migrations/authority.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/migrations/errors.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/migrations/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/policy/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/policy/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/policy/repository.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/projection/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/projection/authority.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/projection/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/projection/observability.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/projection/projector.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/projection/protocols.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/projection/repository.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/retrieval/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/retrieval/errors.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/retrieval/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/retrieval/protocols.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/retrieval/repository.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/retrieval/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/runs/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/runs/admission.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/runs/audit.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/runs/capacity.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/runs/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/runs/observations.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/sources/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/sources/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/sources/repository.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/sources/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/webui/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/webui/errors.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/webui/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/webui/protocols.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/webui/repository.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/webui/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/workflows/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/workflows/domain.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/control_plane/workflows/repository.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/core/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/core/agent_config_admin.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/core/capability_contract.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/core/config_admin.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/core/event_loop.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/core/provider_materialization.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/core/providers.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/core/settings.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/core/transport.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/current_plan_publication.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/data_migrations.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/certification_assets.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/cli.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/config_generator.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/doctor.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/doctor_certification.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/doctor_coverage.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/doctor_graph.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/doctor_lakehouse.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/doctor_observability.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/doctor_support.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/engine_lock.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/exit_criteria.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/file_lock.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/genesis_environments.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/host_config.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/host_lock.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/kubernetes_first_boot.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/live_mount_guard.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/local_gates.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/preflight.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/production_ops.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/profile_guard.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/public_ingress_identity.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/release_canary.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/release_candidate.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/repo_templates.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/self_deploy.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/semantic_provisioning.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/venv_autosync.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/venv_sync.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/venv_sync_types.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/deployment/webui_reference_model.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/ecosystem/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/ecosystem/agent_manager_dashboard.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/ecosystem/ard_federation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/ecosystem/ard_registry.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/ecosystem/ard_signing.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/ecosystem/hook_installer.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/epistemic.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/evolution/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/evolution/wiring_sweep.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/finance/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/finance/alerts.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/finance/dca.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/finance/markets.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/finance/schedule.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/access_contracts.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/catalog_graph.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/catalog_items.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/catalog_reader.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/catalog_sources.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/child_resilience.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/client_toolsets.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/connector_count_pins.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/coverage.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/declarations.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/discovery_authority.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/epistemic_adapter.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/error_budget.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/feeds.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/health.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/local_skill_catalog.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/mcp_resource_reconciliation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/onboarding.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/pin_store.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/plan_confirmation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/protocol_compat.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/scaling/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/scaling/_model.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/scaling/development_lane.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/scaling/resource_pool_authority.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/scaling/resource_reservation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/scaling/scaling_authority.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/scaling/scaling_intent_reconciler.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/scaling/scaling_signal_authority.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/scaling/service_scale_units.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/service_child.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/session_loads.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/session_notifications.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/shared_multiplexer.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/source_executor.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/surfaces.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/throttle_service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet/virtual_catalog.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/fleet_tool_call.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/aggregator.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/config.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/daemon.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/dashboard_api.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/enhanced_catalog_api.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/fleet.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/fleet_events.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/graph_api.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/ontology_api.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/ports.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/rate_limit.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/registry.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/registry_api.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/remote_oauth_api.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/schema_context_api.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/schema_context_service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/schemas/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/schemas/connector.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/schemas/graph_core.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/schemas/schema_context.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/ansible_tower.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/archivebox.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/aris.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/arr.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/atlassian.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/audio_transcriber.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/audiobookshelf.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/base.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/caddy.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/camunda.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/ciso_assistant.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/clarity.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/container_manager.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/data_science.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/dockerhub.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/documentdb.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/ear.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/egeria.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/emerald_exchange.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/erpnext.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/fan_manager.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/firefly_iii.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/fleet_client.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/freshrss.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/github.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/gitlab.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/google_workspace.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/gramps.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/hdhomerun.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/home_assistant.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/jellyfin.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/jena.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/kafka.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/keycloak.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/langfuse.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/leanix.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/legal_peripherals.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/lgtm.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/listmonk.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/mattermost.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/mealie.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/media_downloader.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/microsoft.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/nextcloud.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/okta.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/ollama.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/onetrust.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/openbao.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/orchestrator.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/owncast.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/paperless_ngx.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/plane.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/portainer.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/postiz.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/pulselink.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/qbittorrent.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/repository_manager.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/rom_manager.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/scholarx.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/searxng.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/sentry.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/servicenow.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/stirlingpdf.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/systems_manager.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/technitium.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/teleport.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/tunnel_manager.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/twenty.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/uptime_kuma.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/vector_db.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/wger.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/gateway/widgets/zulip.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/host_bindings.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/admin_console.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/admission.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/api_keys.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/approval.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/approval_engine.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/approval_registration.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/bootstrap.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/broker.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/browser.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/browser_broker.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/browser_composition.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/browser_runtime.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/client_entry_points.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/composition.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/engine.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/engine_ports.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/issuer.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/ldap.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/local_browser.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/mail_capability.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/mfa.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/oidc.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/ports.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/saml.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/identity/scim.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/ingest/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/ingest/connector_sources.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/ingest/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/ingest/source_catalog.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/local_browser_boundary.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/local_browser_channel.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/agent_control.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/arbora_operations.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/_arbora_action_manifest.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/action_dispatch.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/arbora_capabilities.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/arbora_surface.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/client_credentials.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/concurrency.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/connector_surface.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/context_helpers.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/delegated_auth.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/engine_routing.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/engine_surface_types.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/eunomia_principal.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/httpx_boundary.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/intent_contract.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/middlewares.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/oauth_log_hygiene.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/ontology_types.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/optional_tool_features.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/remote_oauth_broker.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/server_factory.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/skill_coverage.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tasks_extension.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tool_specs.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/_surface_selection.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/analysis_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/analyze_suite.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/audit_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/candidate_claim_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/compliance_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/config_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/domain_ops_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/engine_surface_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/engine_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/epistemic_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/governance_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/graph_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/intent_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/mcp_apps.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/ontology_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/query_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/reach_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/secret_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/state_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/tools/write_ingest_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/verbose_tools.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/backing/write_ingest_types.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/bootstrap.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/browser_dispatch.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/browser_state.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/catalog_composition.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/composition.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/current_plan_reader.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/decide_wiring.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/effect_journal.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/harness_host.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/hosted_invocation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/legacy_action_mapping.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/operation_registry.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/routes.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/run_reader.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/runtime.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/served_engine.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/served_invocation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/server.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/source_reader.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/task_plan.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/mcp_server/task_plan_runtime.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/action_dispatch.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/alert_intake.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/discord.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/googlechat.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/googlemeet.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/imessage.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/irc.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/line.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/matrix.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/mattermost.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/nextcloud.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/signal.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/slack.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/synology.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/teams.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/telegram.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/twitch.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/voicecall.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/backends/whatsapp.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/base.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/capabilities.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/coalescer.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/commands.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/governed_send.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/host_ports.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/inbox.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/intake.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/lease.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/models.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/planner_handler.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/polling.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/reach.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/registry.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/render.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/router.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/supervision.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/messaging/transport.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/native_run_admission.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/correlation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/custom_observability.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/error_detail_sink.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/gateway_health.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/gateway_metrics.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/health.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/langfuse_exporter.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/langfuse_trust.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/readiness.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/runtime_health.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/runtime_signals.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/subsystem_health.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/telemetry.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/observability/trace_ontology.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/ontology/shapes/runtime.shapes.ttl +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-01.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-02.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-03.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-04.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-05.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-06.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-07.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-08.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-09.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cmdb-trm-10.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-a.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-b.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-c.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-d1.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-d10.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-d2.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-d3.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-d4.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-d5.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-d6.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-d7.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-d8.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/cq-d9.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/delegation-cycle-refused.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/delegation-fan-out.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/delegation-gitlab-servicenow-plane.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/delegation-ordered-dag.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/delegation-plan-persisted.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/prompts/incident-triage-system.json +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/run_origin.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/actor_context.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/anonymous.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/auth.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/config_sensitivity.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/conformance/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/conformance/surface_inventory.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/conformance/surface_manifest.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/delegation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/elevation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/error_surface.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/http_boundary.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/identifiers.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/identity.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/log_redaction.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/oidc_discovery.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/operation_result.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/prompt_injection.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/request_identity.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/run_authority.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/run_token.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/scope_registry.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/secrets.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/security_policy_middleware.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/security/settings.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/semantic_content.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/agent-utilities-source-integration/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/agent-utilities-source-integration/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/agent-utilities-source-integration/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/references/first-boot-verification.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/references/fleet-and-control-plane.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/references/identity-and-access.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/references/secrets-and-federation.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-deployment/references/telemetry.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-development/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-development/references/bootstrap.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-evolution/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-evolution/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-evolution/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/TROUBLESHOOTING.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/bare-metal.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/compose-and-podman.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/data-plane-substrate.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/deployment-contract.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/development-workspace.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/docker-swarm.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/engine-identity-admission.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/kubernetes-and-helm.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/orchestrator-migration-cutover.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/runtime-topology.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-genesis/references/security-and-operations.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/arbora-repository-development/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/autonomous-contribution/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/autonomous-contribution/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/autonomous-contribution/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/core-pack.txt +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-engine-and-modalities/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-engine-and-modalities/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-engine-and-modalities/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-ingestion-and-integration/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-ingestion-and-integration/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-ingestion-and-integration/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-ingestion-and-integration/references/ingest-connector-reference.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-ingestion-and-integration/references/ingest_manifest.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-modeling-and-mutation/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-modeling-and-mutation/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-modeling-and-mutation/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-orchestration-and-automation/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-orchestration-and-automation/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-orchestration-and-automation/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-query-and-explanation/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-query-and-explanation/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-query-and-explanation/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-query-and-explanation/references/uql-reference.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-research-and-analysis/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-research-and-analysis/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-research-and-analysis/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-runtime-and-governance/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-runtime-and-governance/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/graph-runtime-and-governance/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/skills/using-arbora/SKILL.md +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/unique_records.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/webui_host/__init__.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/webui_host/contact_delivery.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/webui_host/contact_governance.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/webui_host/mcp_delegation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/webui_host/package_layout_expectation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/webui_host/session_boundary.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/webui_host/voice_delegation.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/webui_host/webui_co_service.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora/work_items.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora.egg-info/SOURCES.txt +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora.egg-info/dependency_links.txt +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora.egg-info/entry_points.txt +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora.egg-info/requires.txt +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/arbora.egg-info/top_level.txt +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/pyproject.toml +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/setup.cfg +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_a2a_extension_lifespan.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_agent_runs.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_agents_run_end_to_end.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_boot_diagnostics.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_check_acceptance_evidence.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_check_connector_count_pins.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_check_core_skills.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_check_wiring.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_component_registry_boundary_seeds.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_connector_pack_typed_publisher.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_connector_runner_composition.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_current_plan_publication.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_data_migrations.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_dependency_manifest.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_docs_surface.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_epistemic_adapter.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_epistemic_loop_lifecycle.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_fleet_catalog_reader.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_host_bindings.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_installed_content.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_native_run_admission.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_native_run_scope.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_package_layout.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_persisted_shapes.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_real_anonymous_boot.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_real_boot.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_real_boot_messaging.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_real_boot_ports.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_real_boot_read_assertions.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_run_event_payloads.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_run_origin.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_semantic_content.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_served_engine_native_labels.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_served_operation_api.py +0 -0
- {arbora-0.1.8.dev11 → arbora-0.1.8.dev12}/tests/test_unique_records.py +0 -0
- {arbora-0.1.8.dev11 → 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
|
+
)
|
|
@@ -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.
|
|
@@ -138,10 +138,12 @@ _MAX_DELEGATED_VALUE_BYTES = 4 * 1024 * 1024
|
|
|
138
138
|
_MAX_CHILD_SSE_EVENT_BYTES = 2 * _MAX_DELEGATED_VALUE_BYTES
|
|
139
139
|
_MAX_DELEGATED_NODES = 16_384
|
|
140
140
|
_MAX_DELEGATED_DEPTH = 32
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
141
|
+
#: Resource and prompt listings keep a fixed per-child count bound. A tool
|
|
142
|
+
#: catalog has no count bound at all (ARBORA-FLEET-R069): a connector that
|
|
143
|
+
#: serves one tool per upstream operation is admitted whole.
|
|
144
|
+
_MAX_DISCOVERED_DESCRIPTORS = 2_048
|
|
145
|
+
#: One child tool descriptor's structural allowance. Each descriptor is
|
|
146
|
+
#: bounded on its own; a large catalog is never truncated (ARBORA-FLEET-R069).
|
|
145
147
|
_MAX_CATALOG_NODES = 131_072
|
|
146
148
|
# Skills-over-MCP (CONCEPT:MERISTEM-ECO.mcp.skills-over-mcp-provider): a probed
|
|
147
149
|
# server's Resources may include ``skill://{name}/SKILL.md`` entries. Bounded
|
|
@@ -857,31 +859,80 @@ def _bounded_tool_entry(tool: _typing.Any) -> dict[str, _typing.Any]:
|
|
|
857
859
|
return item
|
|
858
860
|
|
|
859
861
|
|
|
862
|
+
class FleetCatalogPageError(RuntimeError):
|
|
863
|
+
"""One page of a child's ``tools/list`` could not be read.
|
|
864
|
+
|
|
865
|
+
Typed (ARBORA-FLEET-R068): the listing is refused whole, never served
|
|
866
|
+
partial, so a connector can never silently lose tools. The probe records
|
|
867
|
+
it as the server's error and the primer retries; the last good catalog
|
|
868
|
+
keeps serving meanwhile.
|
|
869
|
+
"""
|
|
870
|
+
|
|
871
|
+
|
|
860
872
|
def _bounded_tool_catalog(raw_tools: _typing.Any) -> list[dict[str, _typing.Any]]:
|
|
861
873
|
"""Project one child catalog into a bounded, JSON-compatible shape.
|
|
862
874
|
|
|
863
875
|
The MCP SDK decodes remote responses before returning them to us. This
|
|
864
876
|
boundary prevents a child from turning that decoded value into an
|
|
865
|
-
unbounded in-memory/KG catalog:
|
|
866
|
-
|
|
867
|
-
|
|
877
|
+
unbounded in-memory/KG catalog: names, descriptions, schemas, and
|
|
878
|
+
annotations are validated per descriptor before any caller can cache or
|
|
879
|
+
register them. The tool count has no bound (ARBORA-FLEET-R069).
|
|
868
880
|
"""
|
|
869
881
|
|
|
870
|
-
if (
|
|
871
|
-
not isinstance(raw_tools, list | tuple)
|
|
872
|
-
or len(raw_tools) > _MAX_DISCOVERED_TOOLS
|
|
873
|
-
):
|
|
882
|
+
if not isinstance(raw_tools, list | tuple):
|
|
874
883
|
raise RuntimeError("MCP child tool catalog exceeded its boundary")
|
|
875
884
|
tools: list[dict[str, _typing.Any]] = [
|
|
876
885
|
_bounded_tool_entry(tool) for tool in raw_tools
|
|
877
886
|
]
|
|
878
887
|
try:
|
|
879
|
-
|
|
888
|
+
for entry in tools:
|
|
889
|
+
_assert_bounded_json_value(entry, max_nodes=_MAX_CATALOG_NODES)
|
|
880
890
|
except _fastmcp_exceptions.ToolError:
|
|
881
891
|
raise RuntimeError("MCP child tool catalog exceeded its boundary") from None
|
|
882
892
|
return tools
|
|
883
893
|
|
|
884
894
|
|
|
895
|
+
def _next_cursor(result: _typing.Any) -> str | None:
|
|
896
|
+
"""A ``tools/list`` page's continuation cursor, or ``None`` on the last."""
|
|
897
|
+
cursor = getattr(result, "next_cursor", None)
|
|
898
|
+
return cursor if isinstance(cursor, str) and cursor else None
|
|
899
|
+
|
|
900
|
+
|
|
901
|
+
async def _list_page(session: _typing.Any, cursor: str | None) -> _typing.Any:
|
|
902
|
+
try:
|
|
903
|
+
if cursor is None:
|
|
904
|
+
return await session.list_tools()
|
|
905
|
+
return await session.list_tools(
|
|
906
|
+
params=mcp_types.PaginatedRequestParams(cursor=cursor)
|
|
907
|
+
)
|
|
908
|
+
except Exception as exc:
|
|
909
|
+
raise FleetCatalogPageError(
|
|
910
|
+
f"MCP child tools/list page failed ({type(exc).__name__})"
|
|
911
|
+
) from exc
|
|
912
|
+
|
|
913
|
+
|
|
914
|
+
async def _list_all_tools(session: _typing.Any) -> list[_typing.Any]:
|
|
915
|
+
"""Every tool a child serves: ``tools/list`` followed to its last page.
|
|
916
|
+
|
|
917
|
+
ARBORA-FLEET-R068: a child that paginates is read cursor by cursor until
|
|
918
|
+
it returns no ``nextCursor``. A failed page or a repeated cursor refuses
|
|
919
|
+
the listing whole with :class:`FleetCatalogPageError`; a partial catalog
|
|
920
|
+
is never returned.
|
|
921
|
+
"""
|
|
922
|
+
result = await _list_page(session, None)
|
|
923
|
+
tools = list(result.tools)
|
|
924
|
+
seen: set[str] = set()
|
|
925
|
+
cursor = _next_cursor(result)
|
|
926
|
+
while cursor is not None:
|
|
927
|
+
if cursor in seen:
|
|
928
|
+
raise FleetCatalogPageError("MCP child tools/list cursor repeated")
|
|
929
|
+
seen.add(cursor)
|
|
930
|
+
result = await _list_page(session, cursor)
|
|
931
|
+
tools.extend(result.tools)
|
|
932
|
+
cursor = _next_cursor(result)
|
|
933
|
+
return tools
|
|
934
|
+
|
|
935
|
+
|
|
885
936
|
def _tool_catalog_digest(tools: list[MCPTool]) -> str:
|
|
886
937
|
"""Return a stable digest of the client-visible portion of one child catalog.
|
|
887
938
|
|
|
@@ -913,7 +964,7 @@ def _assert_bounded_resource_list(raw_resources: _typing.Any) -> None:
|
|
|
913
964
|
|
|
914
965
|
if not isinstance(raw_resources, list | tuple):
|
|
915
966
|
raise RuntimeError("MCP child resource catalog is invalid")
|
|
916
|
-
if len(raw_resources) >
|
|
967
|
+
if len(raw_resources) > _MAX_DISCOVERED_DESCRIPTORS:
|
|
917
968
|
raise RuntimeError("MCP child resource catalog exceeded its boundary")
|
|
918
969
|
|
|
919
970
|
|
|
@@ -921,7 +972,10 @@ def _bounded_descriptor_catalog(
|
|
|
921
972
|
values: _typing.Any, *, key: str, family: str
|
|
922
973
|
) -> list[dict[str, _typing.Any]]:
|
|
923
974
|
"""Project one native MCP descriptor family through the shared boundary."""
|
|
924
|
-
if
|
|
975
|
+
if (
|
|
976
|
+
not isinstance(values, list | tuple)
|
|
977
|
+
or len(values) > _MAX_DISCOVERED_DESCRIPTORS
|
|
978
|
+
):
|
|
925
979
|
raise RuntimeError(f"MCP child {family} catalog exceeded its boundary")
|
|
926
980
|
projected: list[dict[str, _typing.Any]] = []
|
|
927
981
|
for value in values:
|
|
@@ -3165,8 +3219,7 @@ class MCPMultiplexer:
|
|
|
3165
3219
|
``record_state=False``: an ephemeral per-principal session must never
|
|
3166
3220
|
write into the process-wide admitted-tool map.
|
|
3167
3221
|
"""
|
|
3168
|
-
|
|
3169
|
-
tools = list(tools_result.tools)
|
|
3222
|
+
tools = await _list_all_tools(session)
|
|
3170
3223
|
admitted = self._oauth_admitted_tools(
|
|
3171
3224
|
server_name, original_name, runtime_policy, tools
|
|
3172
3225
|
)
|
|
@@ -4134,7 +4187,8 @@ class MCPMultiplexer:
|
|
|
4134
4187
|
if session is None:
|
|
4135
4188
|
return
|
|
4136
4189
|
try:
|
|
4137
|
-
tools =
|
|
4190
|
+
tools = await _list_all_tools(session)
|
|
4191
|
+
_bounded_tool_catalog(tools)
|
|
4138
4192
|
except Exception as exc:
|
|
4139
4193
|
logger.warning(
|
|
4140
4194
|
"list_changed refresh of %s failed: %s",
|
|
@@ -4142,6 +4196,10 @@ class MCPMultiplexer:
|
|
|
4142
4196
|
redact_for_log(exc),
|
|
4143
4197
|
)
|
|
4144
4198
|
return
|
|
4199
|
+
# ARBORA-FLEET-R070: the new list replaces the served one now,
|
|
4200
|
+
# without a restart; the next catalog read re-probes the child.
|
|
4201
|
+
self._probe_cache.pop(server_name, None)
|
|
4202
|
+
await self._publish_live_tools(server_name, tools)
|
|
4145
4203
|
await self._announce_handshake(server_name, session, tools, "list_changed")
|
|
4146
4204
|
|
|
4147
4205
|
async def handler(message: IncomingMessage) -> None:
|
|
@@ -4272,9 +4330,8 @@ class MCPMultiplexer:
|
|
|
4272
4330
|
sessions = [
|
|
4273
4331
|
await _connect_one(stack, generation_secret) for _ in range(pool_size)
|
|
4274
4332
|
]
|
|
4275
|
-
|
|
4276
|
-
_bounded_tool_catalog(
|
|
4277
|
-
tools = list(tools_result.tools)
|
|
4333
|
+
tools = await _list_all_tools(sessions[0])
|
|
4334
|
+
_bounded_tool_catalog(tools)
|
|
4278
4335
|
await self._announce_handshake(server_name, sessions[0], tools)
|
|
4279
4336
|
if runtime_policy is not None:
|
|
4280
4337
|
tools = self._admit_runtime_policy_tools(
|
|
@@ -4765,6 +4822,35 @@ class MCPMultiplexer:
|
|
|
4765
4822
|
self._retract_removed_from_sessions(stale_names - set(refreshed_by_name))
|
|
4766
4823
|
return refreshed, True
|
|
4767
4824
|
|
|
4825
|
+
async def _publish_live_tools(
|
|
4826
|
+
self, server_name: str, tools: list[_typing.Any]
|
|
4827
|
+
) -> None:
|
|
4828
|
+
"""Serve a mounted child's re-listed tools (ARBORA-FLEET-R070).
|
|
4829
|
+
|
|
4830
|
+
The same policy admission and schema refresh a new child generation
|
|
4831
|
+
gets; a child that is not mounted has nothing to publish.
|
|
4832
|
+
"""
|
|
4833
|
+
runtime = self.children.get(server_name)
|
|
4834
|
+
if runtime is None:
|
|
4835
|
+
return
|
|
4836
|
+
cfg = self.load_catalog().get(server_name)
|
|
4837
|
+
if cfg is None:
|
|
4838
|
+
return
|
|
4839
|
+
policy = self._child_runtime_policies.get(server_name)
|
|
4840
|
+
if policy is not None:
|
|
4841
|
+
tools = self._admit_runtime_policy_tools(server_name, policy, tools)
|
|
4842
|
+
await self._refresh_child_tools(
|
|
4843
|
+
server_name, runtime, cfg, self._catalog_epoch, tools
|
|
4844
|
+
)
|
|
4845
|
+
|
|
4846
|
+
async def _relist_live_child(self, server_name: str) -> None:
|
|
4847
|
+
"""Re-read a mounted child's whole tool list on its live session."""
|
|
4848
|
+
session = self._live_primary_session(server_name)
|
|
4849
|
+
tools = await _list_all_tools(session)
|
|
4850
|
+
_bounded_tool_catalog(tools)
|
|
4851
|
+
await self._publish_live_tools(server_name, tools)
|
|
4852
|
+
await self._announce_handshake(server_name, session, tools)
|
|
4853
|
+
|
|
4768
4854
|
async def _refresh_child_tools(
|
|
4769
4855
|
self,
|
|
4770
4856
|
server_name: str,
|
|
@@ -5495,6 +5581,8 @@ class MCPMultiplexer:
|
|
|
5495
5581
|
return cached
|
|
5496
5582
|
|
|
5497
5583
|
if server_name in self.children:
|
|
5584
|
+
if force:
|
|
5585
|
+
await self._relist_live_child(server_name)
|
|
5498
5586
|
return await self._live_child_probe(server_name)
|
|
5499
5587
|
|
|
5500
5588
|
cfg = self.load_catalog().get(server_name)
|
|
@@ -5536,9 +5624,12 @@ class MCPMultiplexer:
|
|
|
5536
5624
|
session = await self._open_one_session(
|
|
5537
5625
|
server_name, runtime_cfg, stack
|
|
5538
5626
|
)
|
|
5539
|
-
|
|
5540
|
-
_bounded_tool_catalog(
|
|
5541
|
-
|
|
5627
|
+
tools = await _list_all_tools(session)
|
|
5628
|
+
_bounded_tool_catalog(tools)
|
|
5629
|
+
if force:
|
|
5630
|
+
# An explicit refresh also re-onboards a changed
|
|
5631
|
+
# catalog into the engine (ARBORA-FLEET-R070).
|
|
5632
|
+
await self._announce_handshake(server_name, session, tools)
|
|
5542
5633
|
if runtime_policy is not None:
|
|
5543
5634
|
tools = self._admit_runtime_policy_tools(
|
|
5544
5635
|
server_name,
|
|
@@ -24,6 +24,10 @@ NativeName = Callable[[CatalogItem], str]
|
|
|
24
24
|
ReadItem = Callable[[CatalogItem, Mapping[str, Any], Any], Awaitable[Any]]
|
|
25
25
|
#: Fill the live protocol rows (input schema, annotations) of named servers.
|
|
26
26
|
Prime = Callable[[Iterable[str]], Awaitable[None]]
|
|
27
|
+
#: Re-probe named servers now; answers each server's tool count and error.
|
|
28
|
+
Refresh = Callable[[Iterable[str]], Awaitable[Mapping[str, Any]]]
|
|
29
|
+
#: The most servers one explicit catalog refresh names.
|
|
30
|
+
MAX_REFRESH_SERVERS = 32
|
|
27
31
|
#: The coverage registry reader and endpoint lister for ``status``.
|
|
28
32
|
CoverageRegistry = Callable[[], tuple[Any, ...]]
|
|
29
33
|
CoverageEndpoints = Callable[[], tuple[Any, ...]]
|
|
@@ -157,6 +161,7 @@ class MultiplexerOps:
|
|
|
157
161
|
native_name: NativeName | None = None,
|
|
158
162
|
read_item: ReadItem | None = None,
|
|
159
163
|
prime: Prime | None = None,
|
|
164
|
+
refresh: Refresh | None = None,
|
|
160
165
|
pin_store: PinStore | None = None,
|
|
161
166
|
coverage_registry: CoverageRegistry | None = None,
|
|
162
167
|
coverage_endpoints: CoverageEndpoints | None = None,
|
|
@@ -164,6 +169,7 @@ class MultiplexerOps:
|
|
|
164
169
|
) -> None:
|
|
165
170
|
self.catalog = catalog
|
|
166
171
|
self._prime = prime or _no_prime
|
|
172
|
+
self._refresh = refresh
|
|
167
173
|
self.sessions = sessions
|
|
168
174
|
self._loadable = loadable
|
|
169
175
|
self._mount = mount
|
|
@@ -190,13 +196,14 @@ class MultiplexerOps:
|
|
|
190
196
|
# target's live probe does. Without it a read-only tool resolves as
|
|
191
197
|
# a write, and the caller never learns the tool's parameters.
|
|
192
198
|
await self._prime((server,))
|
|
193
|
-
item = await self.
|
|
194
|
-
if
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
199
|
+
item = await self._tool_item(server, tool)
|
|
200
|
+
if item is None and self._refresh is not None:
|
|
201
|
+
# ARBORA-FLEET-R071: authority is the current catalog. A tool the
|
|
202
|
+
# cached catalog does not hold is re-read from its server once
|
|
203
|
+
# (throttled per server) before the call is refused.
|
|
204
|
+
await self._refresh((server,))
|
|
205
|
+
item = await self._tool_item(server, tool)
|
|
206
|
+
if item is None:
|
|
200
207
|
raise PermissionError("fleet tool is unavailable")
|
|
201
208
|
if not item.required_scopes.issubset(caller.effective_scopes):
|
|
202
209
|
raise PermissionError("child scopes are required")
|
|
@@ -207,6 +214,40 @@ class MultiplexerOps:
|
|
|
207
214
|
raise PermissionError("fleet call denied by policy")
|
|
208
215
|
return item
|
|
209
216
|
|
|
217
|
+
async def _tool_item(self, server: str, tool: str) -> CatalogItem | None:
|
|
218
|
+
item = await self.catalog._raw_get(f"fleet:tool:{server}/{tool}")
|
|
219
|
+
if (
|
|
220
|
+
item is None
|
|
221
|
+
or item.kind != "tool"
|
|
222
|
+
or item.server != server
|
|
223
|
+
or item.name != tool
|
|
224
|
+
):
|
|
225
|
+
return None
|
|
226
|
+
return item
|
|
227
|
+
|
|
228
|
+
async def refresh_catalog(
|
|
229
|
+
self, caller: Any, *, servers: Iterable[str] = ()
|
|
230
|
+
) -> dict[str, Any]:
|
|
231
|
+
"""Re-read the named servers' catalogs now, without a restart.
|
|
232
|
+
|
|
233
|
+
ARBORA-FLEET-R070: the explicit refresh. Each server answers its tool
|
|
234
|
+
count and probe error; a changed catalog is re-onboarded into the
|
|
235
|
+
engine through the handshake. The op's own scopes gate the caller.
|
|
236
|
+
"""
|
|
237
|
+
from arbora.api.invoke.pipeline import OperationRefused
|
|
238
|
+
|
|
239
|
+
named = tuple(dict.fromkeys(servers))
|
|
240
|
+
if not 1 <= len(named) <= MAX_REFRESH_SERVERS:
|
|
241
|
+
raise OperationRefused(
|
|
242
|
+
"INVALID_ARGUMENT",
|
|
243
|
+
{"reason": f"name 1..{MAX_REFRESH_SERVERS} servers"},
|
|
244
|
+
)
|
|
245
|
+
if self._refresh is None:
|
|
246
|
+
raise OperationRefused(
|
|
247
|
+
"UNAVAILABLE", {"reason": "the catalog refresh is unavailable"}
|
|
248
|
+
)
|
|
249
|
+
return {"servers": dict(await self._refresh(named))}
|
|
250
|
+
|
|
210
251
|
async def admitted_surface_item(
|
|
211
252
|
self, caller: Any, family: str, server: str, ident: str
|
|
212
253
|
) -> CatalogItem:
|
|
@@ -95,6 +95,10 @@ class LateFleetGateway:
|
|
|
95
95
|
with _caller_session(caller):
|
|
96
96
|
return await self._bound().unpin(caller, **params)
|
|
97
97
|
|
|
98
|
+
async def catalog_refresh(self, caller: Any, **params: Any) -> Any:
|
|
99
|
+
with _caller_session(caller):
|
|
100
|
+
return await self._bound().catalog_refresh(caller, **params)
|
|
101
|
+
|
|
98
102
|
async def pins_list(self, caller: Any, **params: Any) -> Any:
|
|
99
103
|
with _caller_session(caller):
|
|
100
104
|
return await self._bound().pins_list(caller, **params)
|