arbora 0.1.8.dev1__tar.gz → 0.1.8.dev3__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.dev1 → arbora-0.1.8.dev3}/PKG-INFO +5 -5
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/_version.py +1 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/application.py +7 -7
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/authority.py +236 -121
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/models.py +10 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/agent_host/start_admission.py +3 -2
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/agent_runs.py +68 -6
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/contracts/agent_control_plane.py +5 -4
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/contracts/session.py +23 -2
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/errors.py +3 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/descriptors.json +25 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/engine_errors.py +2 -2
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/registry.json +691 -489
- arbora-0.1.8.dev3/arbora/api/generated/schemas/method.request.json +1 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/schemas/result.query.json +1 -1
- arbora-0.1.8.dev3/arbora/api/generated/task_plan_schema.json +24 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/http/app.py +61 -6
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/http/auth.py +13 -2
- arbora-0.1.8.dev3/arbora/api/http/browser_app.py +177 -0
- arbora-0.1.8.dev3/arbora/api/http/browser_auth.py +132 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/http/routes.py +40 -10
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/invoke/__init__.py +2 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/invoke/audit.py +2 -2
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/invoke/bootstrap.py +7 -6
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/invoke/eg_audit.py +10 -8
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/invoke/executor.py +17 -16
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/invoke/pipeline.py +23 -23
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/invoke/plan.py +4 -4
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/invoke/steps.py +70 -9
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/mcp/caller.py +22 -10
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/mcp/registration.py +2 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/mcp/resolve.py +2 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/mcp/verbs.py +2 -1
- arbora-0.1.8.dev3/arbora/api/ops/browser.py +96 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/plans.py +193 -5
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/research.py +35 -5
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/policy/eunomia.py +21 -6
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/registry/registry.py +14 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_api.py +22 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_runtime.py +25 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_service.py +36 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/client/_generated_models.py +3 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/core/settings.py +10 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/production_ops.py +14 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/semantic_provisioning.py +3 -2
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/epistemic.py +41 -5
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/catalog_composition.py +30 -15
- arbora-0.1.8.dev3/arbora/fleet/declarations.py +61 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/gateway_ops.py +9 -3
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/multiplexer.py +98 -23
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/multiplexer_ops.py +4 -2
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/onboarding.py +167 -24
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/service_child.py +20 -9
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/daemon.py +2 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/fleet_events.py +3 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/rate_limit.py +25 -4
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/registry_api.py +7 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/host_bindings.py +9 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/admission.py +10 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/ports.py +21 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/ingest/connector_sources.py +12 -10
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/middlewares.py +3 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/bootstrap.py +8 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/catalog_composition.py +2 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/current_plan_reader.py +2 -3
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/effect_journal.py +7 -4
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/fleet_composition.py +16 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/harness_host.py +4 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/runtime.py +7 -2
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/served_engine.py +10 -13
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/served_invocation.py +12 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/server.py +16 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/source_reader.py +3 -4
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/actor_context.py +5 -2
- arbora-0.1.8.dev3/arbora/security/anonymous.py +267 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/request_identity.py +74 -12
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-development/SKILL.md +11 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-repository-development/SKILL.md +11 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/webui_host/mcp_delegation.py +4 -2
- arbora-0.1.8.dev3/arbora/webui_host/session_boundary.py +211 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/webui_host/webui_co_service.py +12 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/work_items.py +4 -1
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora.egg-info/PKG-INFO +5 -5
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora.egg-info/SOURCES.txt +7 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora.egg-info/requires.txt +4 -4
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/pyproject.toml +5 -5
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_agents_run_end_to_end.py +11 -0
- arbora-0.1.8.dev3/tests/test_real_anonymous_boot.py +444 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_real_boot.py +11 -4
- arbora-0.1.8.dev3/tests/test_run_event_payloads.py +238 -0
- arbora-0.1.8.dev1/arbora/api/generated/schemas/method.request.json +0 -1
- arbora-0.1.8.dev1/arbora/api/generated/task_plan_schema.json +0 -10
- arbora-0.1.8.dev1/arbora/api/ops/browser.py +0 -76
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/LICENSE +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/README.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/admission.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/approval.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/composition.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/mcp.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/routing.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/sdk_app.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/terminal_event.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/tool_task.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/tool_task_dispatch.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/tool_task_requests.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/a2a/work_items.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/access/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/access/action_policy.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/access/approval.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/access/assurance.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/access/external_policy_sync.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/access/host_start.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/access/priority.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/access/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/access/task_guard.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/acp/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/acp/coding_session.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/acp/session_policy.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/agent_host/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/agent_host/log_access.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/agent_host/log_replay.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/agent_host/log_routes.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/agent_host/log_runtime.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/agent_host/log_sink.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/agent_host/managed_web.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/agent_host/start_configuration.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/contracts/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/contracts/agent_control_contracts.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/contracts/catalog.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/contracts/messaging.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/contracts/provisioning.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/evidence/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/evidence/bundle.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/evidence/contradiction.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/schemas/result.cluster.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/schemas/result.compute.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/schemas/result.coordination.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/schemas/result.graph.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/schemas/result.ingestion.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/schemas/result.messaging.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/schemas/result.reasoning.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/schemas/result.security.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/schemas/result.storage.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/generated/schemas/result.transactions.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/http/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/http/checkout.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/http/openapi.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/http/protocol_routes.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/mcp/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/mcp/discovery.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/mcp/resources.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/mcp/serving.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/_common.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/access.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/agents.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/capacity.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/decide.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/fleet.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/fleet_deploy_watch.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/ingest.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/memory.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/messaging.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/ops.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/policy.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/query.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/registry_factory.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/retrieval.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/runs.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/security.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/source.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/swarm.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/telemetry.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/usage.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/work.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/write_back.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/ops/write_back_models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/policy/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/policy/cache.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/policy/default_policy.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/policy/defaults.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/policy/domain_scopes.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/policy/pdp_remote.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/registry/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/registry/contract_admission.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/registry/digest.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/registry/eg_binding.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/registry/eg_exclusions.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/registry/scopes.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/registry/spec.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/registry/surface_gate.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/api/task_plan_schema.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/architecture/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/architecture/boundary_census.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/architecture/capability_layers.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_attendance.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_attendance_api.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_attended.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_binding.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_cancellation.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_channel.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_client.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_common.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_descriptor.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_dispatch.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_durability.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_lease.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_outcome.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_policy.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_port.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_provenance.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_registration.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_server.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_state.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/browser_control_validation.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/mcp.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/browser_control/trace_bundle.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/client/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/client/_schema.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/client/http.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/client/invoke.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/connector_runner.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/console.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/content.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/_model.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/admission/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/admission/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/admission/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/agents/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/agents/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/agents/repository.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/agents/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/connectors/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/connectors/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/connectors/repository.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/connectors/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/economics/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/economics/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/economics/repository.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/economics/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/fleet_watch/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/fleet_watch/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/foundation/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/foundation/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/foundation/repository.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/foundation/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/migrations/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/migrations/authority.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/migrations/errors.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/migrations/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/policy/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/policy/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/policy/repository.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/projection/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/projection/authority.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/projection/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/projection/observability.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/projection/projector.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/projection/protocols.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/projection/repository.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/retrieval/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/retrieval/errors.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/retrieval/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/retrieval/protocols.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/retrieval/repository.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/retrieval/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/runs/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/runs/admission.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/runs/audit.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/runs/capacity.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/runs/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/runs/observations.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/sources/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/sources/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/sources/repository.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/sources/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/webui/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/webui/errors.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/webui/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/webui/protocols.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/webui/repository.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/webui/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/workflows/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/workflows/domain.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/control_plane/workflows/repository.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/core/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/core/agent_config_admin.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/core/capability_contract.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/core/config_admin.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/core/event_loop.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/core/provider_materialization.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/core/providers.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/core/transport.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/certification_assets.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/cli.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/codex_registration.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/config_generator.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/doctor.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/doctor_certification.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/doctor_coverage.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/doctor_graph.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/doctor_lakehouse.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/doctor_observability.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/doctor_support.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/engine_lock.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/exit_criteria.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/file_lock.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/genesis_environments.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/host_config.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/host_lock.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/kubernetes_first_boot.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/live_mount_guard.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/local_gates.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/preflight.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/profile_guard.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/public_ingress_identity.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/release_canary.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/release_candidate.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/repo_templates.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/self_deploy.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/venv_autosync.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/venv_sync.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/venv_sync_types.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/deployment/webui_reference_model.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/ecosystem/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/ecosystem/agent_manager_dashboard.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/ecosystem/ard_federation.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/ecosystem/ard_registry.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/ecosystem/ard_signing.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/ecosystem/hook_installer.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/evolution/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/evolution/wiring_sweep.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/finance/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/finance/alerts.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/finance/dca.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/finance/markets.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/finance/schedule.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/access_contracts.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/catalog_items.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/catalog_reader.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/catalog_sources.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/child_resilience.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/client_toolsets.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/connector_count_pins.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/discovery_authority.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/epistemic_adapter.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/error_budget.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/feeds.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/health.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/local_skill_catalog.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/mcp_resource_reconciliation.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/protocol_compat.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/scaling/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/scaling/_model.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/scaling/development_lane.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/scaling/resource_pool_authority.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/scaling/resource_reservation.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/scaling/scaling_authority.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/scaling/scaling_intent_reconciler.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/scaling/scaling_signal_authority.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/scaling/service_scale_units.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/session_loads.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/session_notifications.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/shared_multiplexer.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/source_executor.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/surfaces.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet/throttle_service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/fleet_tool_call.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/aggregator.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/config.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/dashboard_api.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/enhanced_catalog_api.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/fleet.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/graph_api.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/ontology_api.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/ports.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/registry.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/remote_oauth_api.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/schema_context_api.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/schema_context_service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/schemas/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/schemas/connector.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/schemas/graph_core.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/schemas/schema_context.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/ansible_tower.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/archivebox.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/aris.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/arr.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/atlassian.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/audio_transcriber.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/audiobookshelf.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/base.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/caddy.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/camunda.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/ciso_assistant.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/clarity.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/container_manager.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/data_science.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/dockerhub.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/documentdb.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/ear.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/egeria.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/emerald_exchange.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/erpnext.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/fan_manager.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/firefly_iii.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/fleet_client.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/freshrss.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/github.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/gitlab.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/google_workspace.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/gramps.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/hdhomerun.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/home_assistant.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/jellyfin.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/jena.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/kafka.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/keycloak.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/langfuse.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/leanix.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/legal_peripherals.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/lgtm.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/listmonk.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/mattermost.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/mealie.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/media_downloader.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/microsoft.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/nextcloud.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/okta.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/ollama.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/onetrust.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/openbao.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/orchestrator.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/owncast.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/paperless_ngx.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/plane.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/portainer.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/postiz.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/pulselink.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/qbittorrent.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/repository_manager.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/rom_manager.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/scholarx.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/searxng.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/sentry.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/servicenow.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/stirlingpdf.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/systems_manager.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/technitium.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/teleport.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/tunnel_manager.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/twenty.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/uptime_kuma.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/vector_db.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/wger.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/gateway/widgets/zulip.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/admin_console.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/api_keys.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/approval.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/approval_engine.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/approval_registration.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/bootstrap.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/broker.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/browser.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/client_entry_points.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/composition.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/engine.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/engine_ports.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/issuer.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/ldap.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/mail_capability.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/mfa.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/oidc.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/saml.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/identity/scim.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/ingest/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/ingest/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/ingest/source_catalog.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/agent_control.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/arbora_operations.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/_arbora_action_manifest.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/action_dispatch.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/arbora_capabilities.json +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/arbora_surface.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/client_credentials.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/concurrency.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/connector_surface.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/content_resources.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/context_helpers.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/delegated_auth.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/engine_routing.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/engine_surface_types.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/eunomia_principal.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/httpx_boundary.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/intent_contract.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/oauth_log_hygiene.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/ontology_types.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/optional_tool_features.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/remote_oauth_broker.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/server_factory.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/skill_coverage.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tasks_extension.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tool_specs.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/_surface_selection.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/analysis_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/analyze_suite.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/audit_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/candidate_claim_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/compliance_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/config_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/domain_ops_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/engine_surface_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/engine_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/epistemic_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/governance_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/graph_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/intent_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/mcp_apps.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/ontology_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/query_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/reach_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/secret_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/state_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/tools/write_ingest_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/verbose_tools.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/backing/write_ingest_types.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/composition.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/decide_wiring.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/hosted_invocation.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/legacy_action_mapping.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/operation_registry.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/mcp_server/routes.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/action_dispatch.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/alert_intake.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/discord.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/googlechat.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/googlemeet.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/imessage.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/irc.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/line.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/matrix.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/mattermost.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/nextcloud.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/signal.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/slack.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/synology.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/teams.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/telegram.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/twitch.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/voicecall.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/backends/whatsapp.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/base.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/capabilities.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/coalescer.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/commands.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/governed_send.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/host_ports.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/inbox.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/intake.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/lease.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/models.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/planner_handler.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/polling.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/reach.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/registry.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/render.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/router.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/service.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/supervision.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/messaging/transport.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/correlation.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/custom_observability.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/error_detail_sink.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/gateway_health.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/gateway_metrics.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/health.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/langfuse_exporter.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/langfuse_trust.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/readiness.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/runtime_health.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/runtime_signals.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/telemetry.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/observability/trace_ontology.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/ontology/shapes/runtime.shapes.ttl +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/auth.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/config_sensitivity.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/conformance/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/conformance/surface_inventory.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/conformance/surface_manifest.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/delegation.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/elevation.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/error_surface.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/http_boundary.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/identifiers.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/identity.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/log_redaction.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/oidc_discovery.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/operation_result.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/prompt_injection.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/run_authority.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/run_token.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/scope_registry.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/secrets.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/security_policy_middleware.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/security/settings.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/semantic_content.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/agent-utilities-source-integration/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/agent-utilities-source-integration/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/agent-utilities-source-integration/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-deployment/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-deployment/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-deployment/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-deployment/references/first-boot-verification.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-deployment/references/fleet-and-control-plane.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-deployment/references/identity-and-access.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-deployment/references/secrets-and-federation.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-deployment/references/telemetry.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-development/references/bootstrap.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-evolution/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-evolution/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-evolution/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/references/TROUBLESHOOTING.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/references/bare-metal.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/references/compose-and-podman.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/references/data-plane-substrate.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/references/deployment-contract.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/references/development-workspace.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/references/docker-swarm.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/references/engine-identity-admission.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/references/kubernetes-and-helm.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/references/orchestrator-migration-cutover.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/references/runtime-topology.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/arbora-genesis/references/security-and-operations.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/autonomous-contribution/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/autonomous-contribution/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/autonomous-contribution/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/core-pack.txt +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-engine-and-modalities/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-engine-and-modalities/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-engine-and-modalities/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-ingestion-and-integration/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-ingestion-and-integration/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-ingestion-and-integration/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-ingestion-and-integration/references/ingest-connector-reference.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-ingestion-and-integration/references/ingest_manifest.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-modeling-and-mutation/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-modeling-and-mutation/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-modeling-and-mutation/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-orchestration-and-automation/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-orchestration-and-automation/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-orchestration-and-automation/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-query-and-explanation/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-query-and-explanation/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-query-and-explanation/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-query-and-explanation/references/uql-reference.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-research-and-analysis/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-research-and-analysis/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-research-and-analysis/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-runtime-and-governance/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-runtime-and-governance/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/graph-runtime-and-governance/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/skills/using-arbora/SKILL.md +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/unique_records.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/webui_host/__init__.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/webui_host/contact_delivery.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/webui_host/contact_governance.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/webui_host/package_layout_expectation.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora/webui_host/voice_delegation.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora.egg-info/dependency_links.txt +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora.egg-info/entry_points.txt +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/arbora.egg-info/top_level.txt +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/setup.cfg +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_agent_runs.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_check_acceptance_evidence.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_check_connector_count_pins.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_check_core_skills.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_check_wiring.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_component_registry_boundary_seeds.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_connector_pack_typed_publisher.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_connector_runner_composition.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_dependency_manifest.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_docs_surface.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_epistemic_adapter.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_fleet_catalog_reader.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_host_bindings.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_package_layout.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_real_boot_messaging.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_semantic_content.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_served_operation_api.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/tests/test_unique_records.py +0 -0
- {arbora-0.1.8.dev1 → arbora-0.1.8.dev3}/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.dev3
|
|
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
|
|
@@ -20,10 +20,10 @@ Requires-Dist: httpx>=0.28.1
|
|
|
20
20
|
Requires-Dist: pyjwt>=2.15.1
|
|
21
21
|
Requires-Dist: joserfc>=1.7.5
|
|
22
22
|
Requires-Dist: python-multipart>=0.0.32
|
|
23
|
-
Requires-Dist: agent-connector-sdk[a2a,mcp]<0.
|
|
23
|
+
Requires-Dist: agent-connector-sdk[a2a,mcp]<0.6.0,>=0.5.4
|
|
24
24
|
Requires-Dist: aiohttp>=3.14.5
|
|
25
25
|
Requires-Dist: anyio>=4.15.1
|
|
26
|
-
Requires-Dist: epistemic-graph[server]<3.0.0,>=2.27.
|
|
26
|
+
Requires-Dist: epistemic-graph[server]<3.0.0,>=2.27.6
|
|
27
27
|
Requires-Dist: fastapi>=0.143.3
|
|
28
28
|
Requires-Dist: filelock>=4.2.0
|
|
29
29
|
Requires-Dist: msgpack>=1.2.1
|
|
@@ -49,10 +49,10 @@ Requires-Dist: types-PyYAML>=6.0.12.20260906; extra == "test"
|
|
|
49
49
|
Requires-Dist: python-telegram-bot>=22.8; extra == "test"
|
|
50
50
|
Requires-Dist: setuptools>=84.0.0; extra == "test"
|
|
51
51
|
Provides-Extra: webui
|
|
52
|
-
Requires-Dist: agent-webui<3.0.0,>=2.
|
|
52
|
+
Requires-Dist: agent-webui<3.0.0,>=2.8.2; extra == "webui"
|
|
53
53
|
Requires-Dist: uvicorn>=0.54.0; extra == "webui"
|
|
54
54
|
Provides-Extra: gateway-widgets
|
|
55
|
-
Requires-Dist: agent-connector-sdk[a2a,mcp]<0.
|
|
55
|
+
Requires-Dist: agent-connector-sdk[a2a,mcp]<0.6.0,>=0.5.4; extra == "gateway-widgets"
|
|
56
56
|
Provides-Extra: vault
|
|
57
57
|
Requires-Dist: hvac>=2.4.0; extra == "vault"
|
|
58
58
|
Provides-Extra: messaging-telegram
|
|
@@ -29,7 +29,7 @@ from .terminal_event import A2ATerminalEventUnavailable
|
|
|
29
29
|
if TYPE_CHECKING:
|
|
30
30
|
from arbora.api.http.auth import AmbientHTTPAuthenticator
|
|
31
31
|
from arbora.api.invoke.pipeline import InvokeServices
|
|
32
|
-
from arbora.api.invoke.steps import
|
|
32
|
+
from arbora.api.invoke.steps import RequestCaller
|
|
33
33
|
|
|
34
34
|
__all__ = [
|
|
35
35
|
"A2AAuthenticator",
|
|
@@ -43,19 +43,19 @@ __all__ = [
|
|
|
43
43
|
class A2AAuthenticator(Protocol):
|
|
44
44
|
async def authenticate(
|
|
45
45
|
self, request: Request, *, scope: str
|
|
46
|
-
) ->
|
|
46
|
+
) -> RequestCaller | None:
|
|
47
47
|
"""Verify authority; an injected adapter may own its dispatch binding."""
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
class AmbientA2AAuthenticator:
|
|
51
51
|
"""Resolve each HTTP request through AU's verified bearer/session flow."""
|
|
52
52
|
|
|
53
|
-
async def authenticate(self, request: Request, *, scope: str) ->
|
|
53
|
+
async def authenticate(self, request: Request, *, scope: str) -> RequestCaller:
|
|
54
54
|
caller = await _request_caller(request)
|
|
55
55
|
return _require_caller_scope(caller, scope)
|
|
56
56
|
|
|
57
57
|
|
|
58
|
-
async def _request_caller(request: Request) ->
|
|
58
|
+
async def _request_caller(request: Request) -> RequestCaller:
|
|
59
59
|
from arbora.api.http.auth import (
|
|
60
60
|
AmbientHTTPAuthenticator,
|
|
61
61
|
verified_bearer_session_for_request,
|
|
@@ -66,13 +66,13 @@ async def _request_caller(request: Request) -> VerifiedCaller:
|
|
|
66
66
|
).authenticate(request)
|
|
67
67
|
|
|
68
68
|
|
|
69
|
-
def _require_caller_scope(caller:
|
|
69
|
+
def _require_caller_scope(caller: RequestCaller, scope: str) -> RequestCaller:
|
|
70
70
|
if scope not in caller.effective_scopes:
|
|
71
71
|
raise PermissionError("Required A2A scope unavailable")
|
|
72
72
|
return caller
|
|
73
73
|
|
|
74
74
|
|
|
75
|
-
async def _refresh_unary_caller(caller:
|
|
75
|
+
async def _refresh_unary_caller(caller: RequestCaller | None) -> None:
|
|
76
76
|
"""Refuse changed authority before entering the task service's session."""
|
|
77
77
|
if caller is None:
|
|
78
78
|
return
|
|
@@ -91,7 +91,7 @@ async def _refresh_unary_caller(caller: VerifiedCaller | None) -> None:
|
|
|
91
91
|
|
|
92
92
|
|
|
93
93
|
@contextmanager
|
|
94
|
-
def _caller_session_scope(caller:
|
|
94
|
+
def _caller_session_scope(caller: RequestCaller | None) -> Iterator[None]:
|
|
95
95
|
"""Bind a returned caller through legacy dispatch; never resolve a fallback."""
|
|
96
96
|
if caller is None:
|
|
97
97
|
# Explicit injected authenticators already own their admission/binding.
|
|
@@ -9,13 +9,14 @@ import logging
|
|
|
9
9
|
from collections import OrderedDict
|
|
10
10
|
from collections.abc import Callable
|
|
11
11
|
from datetime import UTC, datetime
|
|
12
|
-
from typing import Any, Protocol, runtime_checkable
|
|
12
|
+
from typing import Any, Protocol, cast, runtime_checkable
|
|
13
13
|
|
|
14
14
|
from agent_connector_sdk.privacy import persistence_reference
|
|
15
15
|
|
|
16
16
|
from .models import (
|
|
17
17
|
A2AArtifact,
|
|
18
18
|
A2AMessage,
|
|
19
|
+
A2AReplyUnavailable,
|
|
19
20
|
A2ARouteDecision,
|
|
20
21
|
A2ATask,
|
|
21
22
|
A2ATaskState,
|
|
@@ -42,7 +43,8 @@ _RUN_LEASE_SECONDS = 600.0
|
|
|
42
43
|
_TERMINAL = frozenset({"succeeded", "failed", "cancelled", "dead_letter"})
|
|
43
44
|
#: Agent reply text of recent runs, by task id. A WorkItem holds only the
|
|
44
45
|
#: result reference; the durable record is the run's RunEvents in EG. This
|
|
45
|
-
#: bounded process-local view serves
|
|
46
|
+
#: bounded process-local view serves immediate dispatch/list projections;
|
|
47
|
+
#: tasks/get reads the durable record rather than trusting this cache.
|
|
46
48
|
_OUTPUTS: OrderedDict[str, str] = OrderedDict()
|
|
47
49
|
_MAX_OUTPUTS = 1024
|
|
48
50
|
_MAX_OUTPUT_CHARS = 65_536
|
|
@@ -53,7 +55,10 @@ def remember_task_output(task_id: str, output: Any) -> None:
|
|
|
53
55
|
if not task_id or output in (None, ""):
|
|
54
56
|
return
|
|
55
57
|
text = output if isinstance(output, str) else json.dumps(output, default=str)
|
|
56
|
-
|
|
58
|
+
if len(text) > _MAX_OUTPUT_CHARS:
|
|
59
|
+
_OUTPUTS.pop(task_id, None)
|
|
60
|
+
return
|
|
61
|
+
_OUTPUTS[task_id] = text
|
|
57
62
|
_OUTPUTS.move_to_end(task_id)
|
|
58
63
|
while len(_OUTPUTS) > _MAX_OUTPUTS:
|
|
59
64
|
_OUTPUTS.popitem(last=False)
|
|
@@ -85,6 +90,12 @@ _STATE_MAP: dict[str, A2ATaskState] = {
|
|
|
85
90
|
}
|
|
86
91
|
|
|
87
92
|
|
|
93
|
+
class _ReplyUnavailable(RuntimeError):
|
|
94
|
+
def __init__(self, reason: Any) -> None:
|
|
95
|
+
super().__init__("durable A2A reply is unavailable")
|
|
96
|
+
self.availability = A2AReplyUnavailable(reason=reason)
|
|
97
|
+
|
|
98
|
+
|
|
88
99
|
class A2AContextUnavailable(RuntimeError):
|
|
89
100
|
"""The durable context ownership reader could not supply a bounded answer."""
|
|
90
101
|
|
|
@@ -398,16 +409,14 @@ class WorkItemA2AAuthority:
|
|
|
398
409
|
outcome, result_ref, error_ref = "succeeded", None, None
|
|
399
410
|
usage = None
|
|
400
411
|
try:
|
|
401
|
-
from arbora.host_bindings import
|
|
412
|
+
from arbora.host_bindings import preloaded_agent_tools
|
|
402
413
|
|
|
403
414
|
result = await self._agent_executor().execute_agent(
|
|
404
415
|
AgentExecutionRequest(
|
|
405
416
|
agent_name=agent_name,
|
|
406
417
|
task=task,
|
|
407
418
|
run_id=run_id or task_id or None,
|
|
408
|
-
allowed_tools=(
|
|
409
|
-
FLEET_TOOLS if agent_name == FLEET_AGENT_NAME else None
|
|
410
|
-
),
|
|
419
|
+
allowed_tools=preloaded_agent_tools(agent_name),
|
|
411
420
|
),
|
|
412
421
|
session=session,
|
|
413
422
|
)
|
|
@@ -593,18 +602,127 @@ class WorkItemA2AAuthority:
|
|
|
593
602
|
context_id=str(metadata.get("a2a_context_id") or ""),
|
|
594
603
|
status=A2ATaskStatus(
|
|
595
604
|
state=state,
|
|
596
|
-
timestamp=WorkItemA2AAuthority._timestamp(
|
|
605
|
+
timestamp=WorkItemA2AAuthority._timestamp(
|
|
606
|
+
item["updated_at_ms"] / 1000
|
|
607
|
+
if isinstance(item.get("updated_at_ms"), (int, float))
|
|
608
|
+
else item.get("updated_at")
|
|
609
|
+
),
|
|
597
610
|
),
|
|
598
611
|
artifacts=task_output_artifacts(task_id),
|
|
599
612
|
metadata={"arbora": public_metadata},
|
|
600
613
|
)
|
|
601
614
|
|
|
615
|
+
@staticmethod
|
|
616
|
+
def _read_reply_payload(payload: Any, task_id: str) -> Any:
|
|
617
|
+
"""Decode the bounded durable payload before validating its identity."""
|
|
618
|
+
from arbora.agent_runs import MAX_RUN_EVENT_PAYLOAD_BYTES
|
|
619
|
+
|
|
620
|
+
if not isinstance(payload, str):
|
|
621
|
+
raise RuntimeError("durable A2A reply is unavailable")
|
|
622
|
+
try:
|
|
623
|
+
if len(payload.encode("utf-8")) > MAX_RUN_EVENT_PAYLOAD_BYTES:
|
|
624
|
+
raise ValueError("run event exceeds its payload bound")
|
|
625
|
+
event = json.loads(payload)
|
|
626
|
+
except (ValueError, UnicodeError) as exc:
|
|
627
|
+
raise RuntimeError("durable A2A reply is unavailable") from exc
|
|
628
|
+
WorkItemA2AAuthority._check_reply_marker(event, task_id)
|
|
629
|
+
return event
|
|
630
|
+
|
|
631
|
+
@staticmethod
|
|
632
|
+
def _check_reply_marker(event: Any, task_id: str) -> None:
|
|
633
|
+
"""Refuse malformed markers before exposing a typed availability reason."""
|
|
634
|
+
from arbora.agent_runs import RUN_EVENT_PAYLOAD_ERROR_SCHEMA
|
|
635
|
+
|
|
636
|
+
if (
|
|
637
|
+
isinstance(event, dict)
|
|
638
|
+
and event.get("schema") == RUN_EVENT_PAYLOAD_ERROR_SCHEMA
|
|
639
|
+
):
|
|
640
|
+
error = event.get("payload_error")
|
|
641
|
+
if not (
|
|
642
|
+
event.get("type") == "graph_complete"
|
|
643
|
+
and event.get("run_id") == task_id
|
|
644
|
+
and set(event)
|
|
645
|
+
<= {"schema", "type", "run_id", "step", "status", "payload_error"}
|
|
646
|
+
and type(event.get("step")) is int
|
|
647
|
+
and 0 <= event["step"] <= 2**63 - 1
|
|
648
|
+
):
|
|
649
|
+
raise RuntimeError("durable A2A reply is unavailable")
|
|
650
|
+
WorkItemA2AAuthority._raise_reply_marker(event, error)
|
|
651
|
+
|
|
652
|
+
@staticmethod
|
|
653
|
+
def _raise_reply_marker(event: dict[str, Any], error: Any) -> None:
|
|
654
|
+
"""Validate marker details before raising their typed refusal."""
|
|
655
|
+
from arbora.agent_runs import MAX_RUN_EVENT_PAYLOAD_BYTES
|
|
656
|
+
|
|
657
|
+
if not (
|
|
658
|
+
isinstance(error, dict)
|
|
659
|
+
and set(error) == {"code", "max_bytes"}
|
|
660
|
+
and type(error["max_bytes"]) is int
|
|
661
|
+
and error["max_bytes"] == MAX_RUN_EVENT_PAYLOAD_BYTES
|
|
662
|
+
and isinstance(error["code"], str)
|
|
663
|
+
and event.get("status") in (None, "completed", "stopped")
|
|
664
|
+
and error["code"] in {"payload_too_large", "payload_serialization_failed"}
|
|
665
|
+
):
|
|
666
|
+
raise RuntimeError("durable A2A reply is unavailable")
|
|
667
|
+
raise _ReplyUnavailable(error["code"])
|
|
668
|
+
|
|
669
|
+
@staticmethod
|
|
670
|
+
def _reply_text(event: Any, task_id: str) -> str:
|
|
671
|
+
"""Accept output only from the matching successful terminal run."""
|
|
672
|
+
result = event.get("result") if isinstance(event, dict) else None
|
|
673
|
+
if not (
|
|
674
|
+
isinstance(event, dict)
|
|
675
|
+
and event.get("type") == "graph_complete"
|
|
676
|
+
and event.get("run_id") == task_id
|
|
677
|
+
and isinstance(result, dict)
|
|
678
|
+
and result.get("run_id") == task_id
|
|
679
|
+
and result.get("status") in {"completed", "stopped"}
|
|
680
|
+
and isinstance(result.get("output"), str)
|
|
681
|
+
):
|
|
682
|
+
raise RuntimeError("durable A2A reply is unavailable")
|
|
683
|
+
return cast(str, result["output"])
|
|
684
|
+
|
|
685
|
+
def _persisted_artifacts(
|
|
686
|
+
self, task_id: str, *, item: dict[str, Any]
|
|
687
|
+
) -> list[A2AArtifact] | None:
|
|
688
|
+
"""Read an existing terminal payload, never reconstruct a receipt."""
|
|
689
|
+
if item.get("status") != "succeeded":
|
|
690
|
+
return None
|
|
691
|
+
engine, _work_engine = self._engine()
|
|
692
|
+
rows = engine.query_cypher(
|
|
693
|
+
"MATCH (e) WHERE e.type = 'RunEvent' "
|
|
694
|
+
"AND e.run_id = $run_id AND e.task_id = $run_id "
|
|
695
|
+
"AND e.event_type = $event_type "
|
|
696
|
+
"RETURN e.payload AS payload LIMIT 2",
|
|
697
|
+
{"run_id": task_id, "event_type": "graph_complete"},
|
|
698
|
+
)
|
|
699
|
+
if rows == []:
|
|
700
|
+
return None
|
|
701
|
+
if not isinstance(rows, list) or len(rows) != 1:
|
|
702
|
+
raise RuntimeError("durable A2A reply is unavailable")
|
|
703
|
+
row = rows[0]
|
|
704
|
+
payload = row.get("payload") if isinstance(row, dict) else None
|
|
705
|
+
event = self._read_reply_payload(payload, task_id)
|
|
706
|
+
text = self._reply_text(event, task_id)
|
|
707
|
+
if len(text) > _MAX_OUTPUT_CHARS:
|
|
708
|
+
raise _ReplyUnavailable("reply_too_large")
|
|
709
|
+
if not text:
|
|
710
|
+
return None
|
|
711
|
+
return [
|
|
712
|
+
A2AArtifact(
|
|
713
|
+
artifact_id=f"{task_id}:reply",
|
|
714
|
+
name="reply",
|
|
715
|
+
parts=[A2ATextPart(text=text)],
|
|
716
|
+
)
|
|
717
|
+
]
|
|
718
|
+
|
|
602
719
|
async def get_committed_task(self, task_id: str) -> A2ATask | None:
|
|
603
720
|
return await self.get(task_id, include_committed_event=True)
|
|
604
721
|
|
|
605
722
|
async def get(
|
|
606
723
|
self, task_id: str, *, include_committed_event: bool = False
|
|
607
724
|
) -> A2ATask | None:
|
|
725
|
+
read_session = self._session("kg:read")
|
|
608
726
|
original = self._session("work:read") if include_committed_event else None
|
|
609
727
|
item = await asyncio.to_thread(self._authorized_item, task_id, "kg:read")
|
|
610
728
|
if item is None:
|
|
@@ -614,124 +732,125 @@ class WorkItemA2AAuthority:
|
|
|
614
732
|
owner_ref = self._owner_ref(original)
|
|
615
733
|
if (
|
|
616
734
|
current != original
|
|
617
|
-
or item.get("tenant") != original.tenant
|
|
618
|
-
or item.get("created_by") != owner_ref
|
|
619
735
|
or item.get("metadata", {}).get("a2a_owner_ref") != owner_ref
|
|
620
736
|
):
|
|
621
737
|
raise PermissionError("A2A caller changed during task read")
|
|
738
|
+
if self._session("kg:read") != read_session:
|
|
739
|
+
raise PermissionError("A2A caller changed during task read")
|
|
622
740
|
task = self._project(item, task_id=task_id)
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
read_terminal_event,
|
|
741
|
+
try:
|
|
742
|
+
task.artifacts = await asyncio.to_thread(
|
|
743
|
+
self._persisted_artifacts, task_id, item=item
|
|
627
744
|
)
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
engine, session=session, task_id=task_id, owner_ref=owner_ref
|
|
636
|
-
),
|
|
637
|
-
timeout=5.0,
|
|
638
|
-
)
|
|
639
|
-
except TimeoutError as exc:
|
|
640
|
-
raise A2ATerminalEventUnavailable(
|
|
641
|
-
"committed terminal event is unavailable"
|
|
642
|
-
) from exc
|
|
643
|
-
current = self._session("work:read")
|
|
644
|
-
if (
|
|
645
|
-
current != session
|
|
646
|
-
or current.tenant != session.tenant
|
|
647
|
-
or current.graph != session.graph
|
|
648
|
-
or self._owner_ref(current) != owner_ref
|
|
649
|
-
):
|
|
650
|
-
raise PermissionError("A2A caller changed during terminal read")
|
|
651
|
-
if event["status"] == "available" and (
|
|
652
|
-
_STATE_MAP[event["outcome"]] != task.status.state
|
|
653
|
-
):
|
|
654
|
-
raise A2ATerminalEventUnavailable(
|
|
655
|
-
"committed terminal event is unavailable"
|
|
656
|
-
)
|
|
657
|
-
task.metadata["arbora"]["terminalEvent"] = event
|
|
745
|
+
except _ReplyUnavailable as exc:
|
|
746
|
+
task.artifacts = None
|
|
747
|
+
task.metadata["arbora"]["reply"] = exc.availability.model_dump(mode="json")
|
|
748
|
+
if self._session("kg:read") != read_session:
|
|
749
|
+
raise PermissionError("A2A caller changed during reply read")
|
|
750
|
+
if include_committed_event:
|
|
751
|
+
await self._attach_terminal_event(task, task_id, original)
|
|
658
752
|
return task
|
|
659
753
|
|
|
754
|
+
async def _attach_terminal_event(
|
|
755
|
+
self, task: A2ATask, task_id: str, session: Any
|
|
756
|
+
) -> None:
|
|
757
|
+
"""Read and attach a terminal event under the unchanged caller authority."""
|
|
758
|
+
from .terminal_event import (
|
|
759
|
+
A2ATerminalEventUnavailable,
|
|
760
|
+
read_terminal_event,
|
|
761
|
+
)
|
|
762
|
+
|
|
763
|
+
owner_ref = self._owner_ref(session)
|
|
764
|
+
engine, _work_engine = self._engine()
|
|
765
|
+
try:
|
|
766
|
+
event = await asyncio.wait_for(
|
|
767
|
+
read_terminal_event(
|
|
768
|
+
engine, session=session, task_id=task_id, owner_ref=owner_ref
|
|
769
|
+
),
|
|
770
|
+
timeout=5.0,
|
|
771
|
+
)
|
|
772
|
+
except TimeoutError as exc:
|
|
773
|
+
raise A2ATerminalEventUnavailable(
|
|
774
|
+
"committed terminal event is unavailable"
|
|
775
|
+
) from exc
|
|
776
|
+
current = self._session("work:read")
|
|
777
|
+
if (
|
|
778
|
+
current != session
|
|
779
|
+
or current.tenant != session.tenant
|
|
780
|
+
or current.graph != session.graph
|
|
781
|
+
or self._owner_ref(current) != owner_ref
|
|
782
|
+
):
|
|
783
|
+
raise PermissionError("A2A caller changed during terminal read")
|
|
784
|
+
if event["status"] == "available" and (
|
|
785
|
+
_STATE_MAP[event["outcome"]] != task.status.state
|
|
786
|
+
):
|
|
787
|
+
raise A2ATerminalEventUnavailable("committed terminal event is unavailable")
|
|
788
|
+
task.metadata["arbora"]["terminalEvent"] = event
|
|
789
|
+
|
|
660
790
|
@staticmethod
|
|
661
|
-
def _cursor(owner_ref: str, tenant: str,
|
|
662
|
-
return f"{_digest({'tenant': tenant, 'owner': owner_ref, '
|
|
791
|
+
def _cursor(owner_ref: str, tenant: str, native_cursor: str) -> str:
|
|
792
|
+
return f"{_digest({'tenant': tenant, 'owner': owner_ref, 'cursor': native_cursor})}.{native_cursor}"
|
|
663
793
|
|
|
664
794
|
@classmethod
|
|
665
|
-
def _decode_cursor(
|
|
795
|
+
def _decode_cursor(
|
|
796
|
+
cls, cursor: str | None, *, owner_ref: str, tenant: str
|
|
797
|
+
) -> str | None:
|
|
666
798
|
if cursor is None:
|
|
667
|
-
return
|
|
668
|
-
digest, separator,
|
|
669
|
-
if
|
|
670
|
-
|
|
799
|
+
return None
|
|
800
|
+
digest, separator, native_cursor = cursor.partition(".")
|
|
801
|
+
if (
|
|
802
|
+
not separator
|
|
803
|
+
or not native_cursor
|
|
804
|
+
or digest
|
|
805
|
+
!= _digest({"tenant": tenant, "owner": owner_ref, "cursor": native_cursor})
|
|
671
806
|
):
|
|
672
807
|
raise ValueError("A2A task cursor is invalid")
|
|
673
|
-
|
|
674
|
-
return item_id
|
|
808
|
+
return native_cursor
|
|
675
809
|
|
|
676
|
-
def _list_rows(
|
|
810
|
+
def _list_rows(
|
|
811
|
+
self, *, cursor: str | None, limit: int, tenant: str, owner_ref: str
|
|
812
|
+
) -> Any:
|
|
677
813
|
_engine, work_engine = self._engine()
|
|
678
|
-
return work_engine.
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
"w.metadata AS metadata, w.tenant AS tenant, w.created_by AS created_by "
|
|
685
|
-
"ORDER BY w.id ASC LIMIT $limit",
|
|
686
|
-
{
|
|
687
|
-
"kind": "orchestrator_task",
|
|
688
|
-
"tenant": tenant,
|
|
689
|
-
"owner": owner_ref,
|
|
690
|
-
"after": after,
|
|
691
|
-
"id_prefix": f"{_WORK_ITEM_PREFIX}{_TASK_PREFIX}",
|
|
692
|
-
"limit": limit + 1,
|
|
814
|
+
return work_engine.work_items.list(
|
|
815
|
+
tenant=tenant,
|
|
816
|
+
kind="orchestrator_task",
|
|
817
|
+
metadata_match={
|
|
818
|
+
"a2a_schema": _A2A_METADATA_SCHEMA,
|
|
819
|
+
"a2a_owner_ref": owner_ref,
|
|
693
820
|
},
|
|
821
|
+
cursor=cursor,
|
|
822
|
+
limit=limit,
|
|
694
823
|
)
|
|
695
824
|
|
|
696
|
-
@staticmethod
|
|
697
|
-
def _validated_list_rows(rows: Any, limit: int) -> list[Any]:
|
|
698
|
-
if not isinstance(rows, list) or len(rows) > limit + 1:
|
|
699
|
-
raise RuntimeError("canonical WorkItem list returned invalid data")
|
|
700
|
-
return rows
|
|
701
|
-
|
|
702
825
|
@classmethod
|
|
703
|
-
def _project_list_row(cls, row: Any, *,
|
|
704
|
-
if not
|
|
705
|
-
raise RuntimeError("canonical WorkItem list returned an invalid row")
|
|
706
|
-
metadata = row.get("metadata")
|
|
707
|
-
authorized = (
|
|
708
|
-
row.get("tenant") == tenant
|
|
709
|
-
and row.get("created_by") == owner_ref
|
|
710
|
-
and isinstance(metadata, dict)
|
|
711
|
-
and metadata.get("a2a_schema") == _A2A_METADATA_SCHEMA
|
|
712
|
-
and metadata.get("a2a_owner_ref") == owner_ref
|
|
713
|
-
)
|
|
714
|
-
if not authorized:
|
|
826
|
+
def _project_list_row(cls, row: Any, *, owner_ref: str) -> A2ATask:
|
|
827
|
+
if not cls._owned(row, owner_ref):
|
|
715
828
|
raise RuntimeError("canonical WorkItem list crossed its authority scope")
|
|
716
|
-
item_id = str(row.get("
|
|
829
|
+
item_id = str(row.get("work_item_id") or "")
|
|
717
830
|
task_id = item_id.removeprefix(_WORK_ITEM_PREFIX)
|
|
718
|
-
cls._work_item_id(task_id)
|
|
831
|
+
if cls._work_item_id(task_id) != item_id:
|
|
832
|
+
raise RuntimeError("canonical WorkItem list returned an invalid identity")
|
|
719
833
|
return cls._project(row, task_id=task_id)
|
|
720
834
|
|
|
721
|
-
@
|
|
722
|
-
def
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
835
|
+
@staticmethod
|
|
836
|
+
def _validated_list_page(
|
|
837
|
+
page: Any, limit: int, native_cursor: str | None
|
|
838
|
+
) -> tuple[list[Any], str | None]:
|
|
839
|
+
"""Validate bounded native rows and forward-only continuation together."""
|
|
840
|
+
if not isinstance(page, dict) or not isinstance(page.get("items"), list):
|
|
841
|
+
raise RuntimeError("canonical WorkItem list returned invalid data")
|
|
842
|
+
rows = page["items"]
|
|
843
|
+
continuation = page.get("next_cursor")
|
|
844
|
+
if len(rows) > limit or (
|
|
845
|
+
continuation is not None
|
|
846
|
+
and (
|
|
847
|
+
not isinstance(continuation, str)
|
|
848
|
+
or not continuation
|
|
849
|
+
or continuation == native_cursor
|
|
850
|
+
)
|
|
851
|
+
):
|
|
852
|
+
raise RuntimeError("canonical WorkItem list returned invalid data")
|
|
853
|
+
return rows, continuation
|
|
735
854
|
|
|
736
855
|
async def list(
|
|
737
856
|
self, *, cursor: str | None, limit: int
|
|
@@ -740,30 +859,26 @@ class WorkItemA2AAuthority:
|
|
|
740
859
|
raise ValueError("A2A task page limit must be between 1 and 100")
|
|
741
860
|
session = self._session("kg:read")
|
|
742
861
|
owner_ref = self._owner_ref(session)
|
|
743
|
-
|
|
744
|
-
|
|
862
|
+
native_cursor = self._decode_cursor(
|
|
863
|
+
cursor, owner_ref=owner_ref, tenant=session.tenant
|
|
864
|
+
)
|
|
865
|
+
page = await asyncio.to_thread(
|
|
745
866
|
self._list_rows,
|
|
746
|
-
|
|
867
|
+
cursor=native_cursor,
|
|
747
868
|
limit=limit,
|
|
748
869
|
tenant=session.tenant,
|
|
749
870
|
owner_ref=owner_ref,
|
|
750
871
|
)
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
]
|
|
760
|
-
return tasks, self._next_cursor(
|
|
761
|
-
page,
|
|
762
|
-
tasks,
|
|
763
|
-
limit=limit,
|
|
764
|
-
owner_ref=owner_ref,
|
|
765
|
-
tenant=session.tenant,
|
|
872
|
+
if self._session("kg:read") != session:
|
|
873
|
+
raise PermissionError("A2A caller changed during task listing")
|
|
874
|
+
rows, continuation = self._validated_list_page(page, limit, native_cursor)
|
|
875
|
+
tasks = [self._project_list_row(row, owner_ref=owner_ref) for row in rows]
|
|
876
|
+
next_cursor = (
|
|
877
|
+
self._cursor(owner_ref, session.tenant, continuation)
|
|
878
|
+
if continuation is not None
|
|
879
|
+
else None
|
|
766
880
|
)
|
|
881
|
+
return tasks, next_cursor
|
|
767
882
|
|
|
768
883
|
async def cancel(self, task_id: str) -> A2ATask:
|
|
769
884
|
item = await asyncio.to_thread(self._authorized_item, task_id, "kg:write")
|
|
@@ -20,6 +20,7 @@ __all__ = [
|
|
|
20
20
|
"A2AOperationInvokeParams",
|
|
21
21
|
"A2APlanConfirmParams",
|
|
22
22
|
"A2ARouteDecision",
|
|
23
|
+
"A2AReplyUnavailable",
|
|
23
24
|
"A2ASkill",
|
|
24
25
|
"A2AStreamingAuthority",
|
|
25
26
|
"A2ATask",
|
|
@@ -177,6 +178,15 @@ class A2AArtifact(_WireModel):
|
|
|
177
178
|
parts: list[A2ATextPart] = Field(min_length=1, max_length=32)
|
|
178
179
|
|
|
179
180
|
|
|
181
|
+
class A2AReplyUnavailable(_WireModel):
|
|
182
|
+
"""A completed task can have an explicitly unavailable reply artifact."""
|
|
183
|
+
|
|
184
|
+
status: Literal["unavailable"] = "unavailable"
|
|
185
|
+
reason: Literal[
|
|
186
|
+
"payload_too_large", "payload_serialization_failed", "reply_too_large"
|
|
187
|
+
]
|
|
188
|
+
|
|
189
|
+
|
|
180
190
|
class A2ATaskStatus(_WireModel):
|
|
181
191
|
state: A2ATaskState
|
|
182
192
|
timestamp: str | None = None
|
|
@@ -14,6 +14,7 @@ from arbora.agent_host.start_configuration import (
|
|
|
14
14
|
HostStartConfiguration,
|
|
15
15
|
)
|
|
16
16
|
from arbora.identity.ports import SessionAuthority, SessionState
|
|
17
|
+
from arbora.security.anonymous import session_context
|
|
17
18
|
|
|
18
19
|
if TYPE_CHECKING:
|
|
19
20
|
from arbora.api.contracts.session import GraphSession
|
|
@@ -219,7 +220,7 @@ class HostStartAdmission:
|
|
|
219
220
|
self._check_credential(credential)
|
|
220
221
|
if not isinstance(graph_session, GraphSession):
|
|
221
222
|
raise PermissionError("workspace_denied")
|
|
222
|
-
graph_session
|
|
223
|
+
session_context(graph_session)
|
|
223
224
|
state = await self._sessions.resolve_session(credential)
|
|
224
225
|
self._check_configuration(request, configuration, runtime)
|
|
225
226
|
if not isinstance(state, SessionState) or state.expires_at_ms <= int(
|
|
@@ -245,7 +246,7 @@ class HostStartAdmission:
|
|
|
245
246
|
)
|
|
246
247
|
if not binding.same_binding(final_binding):
|
|
247
248
|
raise PermissionError("workspace_denied")
|
|
248
|
-
claims = graph_session
|
|
249
|
+
claims = session_context(graph_session)
|
|
249
250
|
if any(
|
|
250
251
|
claims.get(key) != state.resolution.request_context[key]
|
|
251
252
|
for key in ("principal", "tenant", "audience", "policy_version")
|