arbora 0.1.8.dev3__tar.gz → 0.1.8.dev5__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.dev3 → arbora-0.1.8.dev5}/PKG-INFO +3 -3
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/_version.py +1 -1
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/__init__.py +16 -0
- arbora-0.1.8.dev5/arbora/a2a/anonymous.py +454 -0
- arbora-0.1.8.dev5/arbora/a2a/anonymous_native.py +84 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/application.py +4 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/authority.py +247 -50
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/composition.py +7 -1
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/mcp.py +6 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/models.py +1 -1
- arbora-0.1.8.dev5/arbora/a2a/run_usage.py +128 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/terminal_event.py +51 -22
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/access/action_policy.py +114 -14
- arbora-0.1.8.dev5/arbora/access/action_policy_source.py +215 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/agent_runs.py +176 -8
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/errors.py +68 -1
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/descriptors.json +61 -1
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/engine_errors.py +1 -1
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/registry.json +639 -1
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/task_plan_schema.json +4 -4
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/http/app.py +38 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/invoke/executor.py +5 -1
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/invoke/pipeline.py +54 -2
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/invoke/steps.py +5 -1
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/mcp/resolve.py +49 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/browser.py +13 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/fleet.py +88 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/plans.py +37 -4
- arbora-0.1.8.dev5/arbora/api/ops/run_graph.py +238 -0
- arbora-0.1.8.dev5/arbora/api/ops/run_replay.py +219 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/runs.py +83 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/task_plan_schema.py +17 -3
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_api.py +13 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_binding.py +7 -4
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_channel.py +8 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_client.py +9 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_dispatch.py +9 -0
- arbora-0.1.8.dev5/arbora/browser_control/browser_control_proposals.py +314 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_provenance.py +1 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_runtime.py +3 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_server.py +34 -1
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_service.py +6 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_state.py +21 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/trace_bundle.py +33 -0
- arbora-0.1.8.dev5/arbora/client/__init__.py +5 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/client/_generated_models.py +6 -1
- arbora-0.1.8.dev5/arbora/client/browser_boundary.py +20 -0
- arbora-0.1.8.dev5/arbora/content.py +128 -0
- arbora-0.1.8.dev5/arbora/core/providers.py +120 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/core/settings.py +21 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/production_ops.py +21 -17
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/epistemic.py +70 -8
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/access_contracts.py +10 -17
- arbora-0.1.8.dev5/arbora/fleet/catalog_graph.py +241 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/child_resilience.py +35 -3
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/declarations.py +22 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/gateway_ops.py +73 -7
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/local_skill_catalog.py +15 -26
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/multiplexer.py +50 -9
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/onboarding.py +35 -2
- arbora-0.1.8.dev5/arbora/fleet/plan_confirmation.py +108 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/host_bindings.py +29 -1
- arbora-0.1.8.dev5/arbora/identity/local_browser.py +99 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/ingest/connector_sources.py +56 -5
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/ingest/service.py +10 -2
- arbora-0.1.8.dev5/arbora/local_browser_channel.py +403 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/server_factory.py +0 -181
- arbora-0.1.8.dev5/arbora/mcp_server/browser_state.py +122 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/current_plan_reader.py +13 -9
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/hosted_invocation.py +38 -1
- arbora-0.1.8.dev5/arbora/mcp_server/run_reader.py +237 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/runtime.py +31 -18
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/served_engine.py +60 -7
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/served_invocation.py +179 -11
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/server.py +8 -3
- arbora-0.1.8.dev5/arbora/mcp_server/task_plan.py +173 -0
- arbora-0.1.8.dev5/arbora/mcp_server/task_plan_runtime.py +316 -0
- arbora-0.1.8.dev5/arbora/native_run_admission.py +79 -0
- arbora-0.1.8.dev5/arbora/prompts/cmdb-trm-01.json +21 -0
- arbora-0.1.8.dev5/arbora/prompts/cmdb-trm-02.json +21 -0
- arbora-0.1.8.dev5/arbora/prompts/cmdb-trm-03.json +21 -0
- arbora-0.1.8.dev5/arbora/prompts/cmdb-trm-04.json +21 -0
- arbora-0.1.8.dev5/arbora/prompts/cmdb-trm-05.json +21 -0
- arbora-0.1.8.dev5/arbora/prompts/cmdb-trm-06.json +21 -0
- arbora-0.1.8.dev5/arbora/prompts/cmdb-trm-07.json +21 -0
- arbora-0.1.8.dev5/arbora/prompts/cmdb-trm-08.json +21 -0
- arbora-0.1.8.dev5/arbora/prompts/cmdb-trm-09.json +21 -0
- arbora-0.1.8.dev5/arbora/prompts/cmdb-trm-10.json +21 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-a.json +20 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-b.json +20 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-c.json +20 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-d1.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-d10.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-d2.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-d3.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-d4.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-d5.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-d6.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-d7.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-d8.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/cq-d9.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/delegation-cycle-refused.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/delegation-fan-out.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/delegation-gitlab-servicenow-plane.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/delegation-ordered-dag.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/delegation-plan-persisted.json +19 -0
- arbora-0.1.8.dev5/arbora/prompts/incident-triage-system.json +21 -0
- arbora-0.1.8.dev5/arbora/run_origin.py +192 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/actor_context.py +10 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/semantic_content.py +2 -2
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/__init__.py +2 -2
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/work_items.py +94 -22
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora.egg-info/PKG-INFO +3 -3
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora.egg-info/SOURCES.txt +54 -1
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora.egg-info/entry_points.txt +0 -3
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora.egg-info/requires.txt +2 -2
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/pyproject.toml +6 -10
- arbora-0.1.8.dev5/tests/test_a2a_extension_lifespan.py +158 -0
- arbora-0.1.8.dev5/tests/test_epistemic_loop_lifecycle.py +212 -0
- arbora-0.1.8.dev5/tests/test_installed_content.py +227 -0
- arbora-0.1.8.dev5/tests/test_native_run_admission.py +261 -0
- arbora-0.1.8.dev5/tests/test_native_run_scope.py +230 -0
- arbora-0.1.8.dev5/tests/test_run_origin.py +259 -0
- arbora-0.1.8.dev5/tests/test_served_engine_native_labels.py +108 -0
- arbora-0.1.8.dev3/arbora/client/__init__.py +0 -1
- arbora-0.1.8.dev3/arbora/content.py +0 -22
- arbora-0.1.8.dev3/arbora/core/providers.py +0 -720
- arbora-0.1.8.dev3/arbora/mcp_server/backing/content_resources.py +0 -64
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/LICENSE +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/README.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/admission.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/approval.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/routing.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/sdk_app.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/tool_task.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/tool_task_dispatch.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/tool_task_requests.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/a2a/work_items.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/access/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/access/approval.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/access/assurance.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/access/external_policy_sync.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/access/host_start.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/access/priority.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/access/service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/access/task_guard.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/acp/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/acp/coding_session.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/acp/session_policy.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/agent_host/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/agent_host/log_access.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/agent_host/log_replay.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/agent_host/log_routes.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/agent_host/log_runtime.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/agent_host/log_sink.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/agent_host/managed_web.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/agent_host/start_admission.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/agent_host/start_configuration.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/contracts/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/contracts/agent_control_contracts.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/contracts/agent_control_plane.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/contracts/catalog.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/contracts/messaging.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/contracts/provisioning.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/contracts/session.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/evidence/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/evidence/bundle.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/evidence/contradiction.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/schemas/method.request.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/schemas/result.cluster.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/schemas/result.compute.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/schemas/result.coordination.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/schemas/result.graph.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/schemas/result.ingestion.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/schemas/result.messaging.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/schemas/result.query.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/schemas/result.reasoning.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/schemas/result.security.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/schemas/result.storage.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/generated/schemas/result.transactions.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/http/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/http/auth.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/http/browser_app.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/http/browser_auth.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/http/checkout.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/http/openapi.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/http/protocol_routes.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/http/routes.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/invoke/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/invoke/audit.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/invoke/bootstrap.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/invoke/eg_audit.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/invoke/plan.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/mcp/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/mcp/caller.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/mcp/discovery.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/mcp/registration.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/mcp/resources.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/mcp/serving.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/mcp/verbs.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/_common.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/access.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/agents.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/capacity.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/decide.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/fleet_deploy_watch.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/ingest.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/memory.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/messaging.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/ops.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/policy.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/query.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/registry_factory.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/research.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/retrieval.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/security.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/source.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/swarm.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/telemetry.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/usage.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/work.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/write_back.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/ops/write_back_models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/policy/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/policy/cache.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/policy/default_policy.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/policy/defaults.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/policy/domain_scopes.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/policy/eunomia.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/policy/pdp_remote.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/registry/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/registry/contract_admission.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/registry/digest.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/registry/eg_binding.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/registry/eg_exclusions.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/registry/registry.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/registry/scopes.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/registry/spec.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/api/registry/surface_gate.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/architecture/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/architecture/boundary_census.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/architecture/capability_layers.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_attendance.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_attendance_api.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_attended.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_cancellation.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_common.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_descriptor.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_durability.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_lease.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_outcome.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_policy.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_port.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_registration.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/browser_control_validation.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/browser_control/mcp.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/client/_schema.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/client/http.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/client/invoke.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/connector_runner.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/console.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/_model.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/admission/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/admission/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/admission/service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/agents/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/agents/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/agents/repository.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/agents/service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/connectors/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/connectors/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/connectors/repository.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/connectors/service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/economics/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/economics/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/economics/repository.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/economics/service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/fleet_watch/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/fleet_watch/service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/foundation/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/foundation/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/foundation/repository.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/foundation/service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/migrations/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/migrations/authority.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/migrations/errors.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/migrations/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/policy/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/policy/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/policy/repository.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/projection/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/projection/authority.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/projection/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/projection/observability.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/projection/projector.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/projection/protocols.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/projection/repository.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/retrieval/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/retrieval/errors.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/retrieval/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/retrieval/protocols.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/retrieval/repository.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/retrieval/service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/runs/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/runs/admission.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/runs/audit.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/runs/capacity.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/runs/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/runs/observations.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/sources/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/sources/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/sources/repository.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/sources/service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/webui/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/webui/errors.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/webui/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/webui/protocols.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/webui/repository.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/webui/service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/workflows/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/workflows/domain.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/control_plane/workflows/repository.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/core/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/core/agent_config_admin.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/core/capability_contract.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/core/config_admin.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/core/event_loop.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/core/provider_materialization.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/core/transport.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/certification_assets.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/cli.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/codex_registration.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/config_generator.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/doctor.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/doctor_certification.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/doctor_coverage.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/doctor_graph.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/doctor_lakehouse.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/doctor_observability.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/doctor_support.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/engine_lock.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/exit_criteria.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/file_lock.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/genesis_environments.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/host_config.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/host_lock.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/kubernetes_first_boot.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/live_mount_guard.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/local_gates.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/preflight.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/profile_guard.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/public_ingress_identity.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/release_canary.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/release_candidate.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/repo_templates.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/self_deploy.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/semantic_provisioning.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/venv_autosync.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/venv_sync.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/venv_sync_types.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/deployment/webui_reference_model.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/ecosystem/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/ecosystem/agent_manager_dashboard.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/ecosystem/ard_federation.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/ecosystem/ard_registry.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/ecosystem/ard_signing.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/ecosystem/hook_installer.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/evolution/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/evolution/wiring_sweep.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/finance/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/finance/alerts.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/finance/dca.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/finance/markets.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/finance/schedule.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/catalog_composition.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/catalog_items.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/catalog_reader.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/catalog_sources.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/client_toolsets.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/connector_count_pins.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/discovery_authority.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/epistemic_adapter.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/error_budget.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/feeds.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/health.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/mcp_resource_reconciliation.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/multiplexer_ops.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/protocol_compat.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/scaling/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/scaling/_model.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/scaling/development_lane.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/scaling/resource_pool_authority.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/scaling/resource_reservation.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/scaling/scaling_authority.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/scaling/scaling_intent_reconciler.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/scaling/scaling_signal_authority.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/scaling/service_scale_units.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/service_child.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/session_loads.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/session_notifications.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/shared_multiplexer.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/source_executor.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/surfaces.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet/throttle_service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/fleet_tool_call.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/aggregator.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/config.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/daemon.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/dashboard_api.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/enhanced_catalog_api.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/fleet.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/fleet_events.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/graph_api.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/ontology_api.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/ports.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/rate_limit.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/registry.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/registry_api.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/remote_oauth_api.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/schema_context_api.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/schema_context_service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/schemas/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/schemas/connector.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/schemas/graph_core.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/schemas/schema_context.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/ansible_tower.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/archivebox.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/aris.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/arr.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/atlassian.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/audio_transcriber.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/audiobookshelf.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/base.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/caddy.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/camunda.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/ciso_assistant.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/clarity.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/container_manager.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/data_science.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/dockerhub.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/documentdb.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/ear.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/egeria.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/emerald_exchange.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/erpnext.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/fan_manager.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/firefly_iii.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/fleet_client.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/freshrss.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/github.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/gitlab.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/google_workspace.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/gramps.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/hdhomerun.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/home_assistant.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/jellyfin.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/jena.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/kafka.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/keycloak.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/langfuse.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/leanix.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/legal_peripherals.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/lgtm.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/listmonk.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/mattermost.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/mealie.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/media_downloader.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/microsoft.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/nextcloud.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/okta.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/ollama.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/onetrust.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/openbao.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/orchestrator.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/owncast.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/paperless_ngx.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/plane.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/portainer.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/postiz.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/pulselink.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/qbittorrent.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/repository_manager.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/rom_manager.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/scholarx.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/searxng.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/sentry.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/servicenow.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/stirlingpdf.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/systems_manager.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/technitium.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/teleport.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/tunnel_manager.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/twenty.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/uptime_kuma.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/vector_db.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/wger.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/gateway/widgets/zulip.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/admin_console.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/admission.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/api_keys.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/approval.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/approval_engine.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/approval_registration.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/bootstrap.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/broker.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/browser.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/client_entry_points.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/composition.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/engine.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/engine_ports.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/issuer.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/ldap.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/mail_capability.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/mfa.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/oidc.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/ports.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/saml.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/identity/scim.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/ingest/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/ingest/source_catalog.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/agent_control.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/arbora_operations.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/_arbora_action_manifest.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/action_dispatch.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/arbora_capabilities.json +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/arbora_surface.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/client_credentials.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/concurrency.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/connector_surface.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/context_helpers.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/delegated_auth.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/engine_routing.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/engine_surface_types.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/eunomia_principal.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/httpx_boundary.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/intent_contract.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/middlewares.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/oauth_log_hygiene.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/ontology_types.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/optional_tool_features.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/remote_oauth_broker.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/skill_coverage.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tasks_extension.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tool_specs.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/_surface_selection.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/analysis_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/analyze_suite.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/audit_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/candidate_claim_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/compliance_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/config_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/domain_ops_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/engine_surface_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/engine_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/epistemic_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/governance_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/graph_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/intent_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/mcp_apps.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/ontology_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/query_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/reach_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/secret_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/state_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/tools/write_ingest_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/verbose_tools.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/backing/write_ingest_types.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/bootstrap.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/catalog_composition.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/composition.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/decide_wiring.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/effect_journal.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/fleet_composition.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/harness_host.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/legacy_action_mapping.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/operation_registry.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/routes.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/mcp_server/source_reader.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/action_dispatch.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/alert_intake.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/discord.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/googlechat.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/googlemeet.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/imessage.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/irc.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/line.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/matrix.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/mattermost.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/nextcloud.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/signal.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/slack.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/synology.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/teams.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/telegram.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/twitch.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/voicecall.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/backends/whatsapp.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/base.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/capabilities.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/coalescer.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/commands.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/governed_send.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/host_ports.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/inbox.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/intake.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/lease.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/models.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/planner_handler.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/polling.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/reach.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/registry.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/render.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/router.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/supervision.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/messaging/transport.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/correlation.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/custom_observability.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/error_detail_sink.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/gateway_health.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/gateway_metrics.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/health.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/langfuse_exporter.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/langfuse_trust.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/readiness.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/runtime_health.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/runtime_signals.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/telemetry.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/observability/trace_ontology.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/ontology/shapes/runtime.shapes.ttl +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/anonymous.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/auth.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/config_sensitivity.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/conformance/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/conformance/surface_inventory.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/conformance/surface_manifest.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/delegation.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/elevation.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/error_surface.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/http_boundary.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/identifiers.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/identity.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/log_redaction.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/oidc_discovery.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/operation_result.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/prompt_injection.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/request_identity.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/run_authority.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/run_token.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/scope_registry.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/secrets.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/security_policy_middleware.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/security/settings.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/agent-utilities-source-integration/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/agent-utilities-source-integration/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/agent-utilities-source-integration/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-deployment/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-deployment/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-deployment/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-deployment/references/first-boot-verification.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-deployment/references/fleet-and-control-plane.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-deployment/references/identity-and-access.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-deployment/references/secrets-and-federation.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-deployment/references/telemetry.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-development/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-development/references/bootstrap.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-evolution/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-evolution/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-evolution/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/references/TROUBLESHOOTING.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/references/bare-metal.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/references/compose-and-podman.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/references/data-plane-substrate.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/references/deployment-contract.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/references/development-workspace.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/references/docker-swarm.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/references/engine-identity-admission.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/references/kubernetes-and-helm.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/references/orchestrator-migration-cutover.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/references/runtime-topology.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-genesis/references/security-and-operations.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/arbora-repository-development/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/autonomous-contribution/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/autonomous-contribution/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/autonomous-contribution/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/core-pack.txt +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-engine-and-modalities/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-engine-and-modalities/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-engine-and-modalities/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-ingestion-and-integration/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-ingestion-and-integration/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-ingestion-and-integration/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-ingestion-and-integration/references/ingest-connector-reference.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-ingestion-and-integration/references/ingest_manifest.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-modeling-and-mutation/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-modeling-and-mutation/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-modeling-and-mutation/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-orchestration-and-automation/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-orchestration-and-automation/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-orchestration-and-automation/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-query-and-explanation/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-query-and-explanation/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-query-and-explanation/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-query-and-explanation/references/uql-reference.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-research-and-analysis/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-research-and-analysis/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-research-and-analysis/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-runtime-and-governance/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-runtime-and-governance/agents/arbora.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/graph-runtime-and-governance/agents/openai.yaml +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/skills/using-arbora/SKILL.md +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/unique_records.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/webui_host/__init__.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/webui_host/contact_delivery.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/webui_host/contact_governance.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/webui_host/mcp_delegation.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/webui_host/package_layout_expectation.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/webui_host/session_boundary.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/webui_host/voice_delegation.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora/webui_host/webui_co_service.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora.egg-info/dependency_links.txt +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/arbora.egg-info/top_level.txt +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/setup.cfg +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_agent_runs.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_agents_run_end_to_end.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_check_acceptance_evidence.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_check_connector_count_pins.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_check_core_skills.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_check_wiring.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_component_registry_boundary_seeds.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_connector_pack_typed_publisher.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_connector_runner_composition.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_dependency_manifest.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_docs_surface.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_epistemic_adapter.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_fleet_catalog_reader.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_host_bindings.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_package_layout.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_real_anonymous_boot.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_real_boot.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_real_boot_messaging.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_run_event_payloads.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_semantic_content.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_served_operation_api.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/tests/test_unique_records.py +0 -0
- {arbora-0.1.8.dev3 → arbora-0.1.8.dev5}/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.dev5
|
|
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,7 +20,7 @@ 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.6.0,>=0.5.
|
|
23
|
+
Requires-Dist: agent-connector-sdk[a2a,mcp]<0.6.0,>=0.5.5
|
|
24
24
|
Requires-Dist: aiohttp>=3.14.5
|
|
25
25
|
Requires-Dist: anyio>=4.15.1
|
|
26
26
|
Requires-Dist: epistemic-graph[server]<3.0.0,>=2.27.6
|
|
@@ -52,7 +52,7 @@ Provides-Extra: webui
|
|
|
52
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.6.0,>=0.5.
|
|
55
|
+
Requires-Dist: agent-connector-sdk[a2a,mcp]<0.6.0,>=0.5.5; extra == "gateway-widgets"
|
|
56
56
|
Provides-Extra: vault
|
|
57
57
|
Requires-Dist: hvac>=2.4.0; extra == "vault"
|
|
58
58
|
Provides-Extra: messaging-telegram
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
"""First-party Arbora unary A2A facade."""
|
|
2
2
|
|
|
3
|
+
from .anonymous import (
|
|
4
|
+
AnonymousCaller,
|
|
5
|
+
AnonymousNativeReadPort,
|
|
6
|
+
AnonymousReadPolicy,
|
|
7
|
+
AnonymousTaskReadOwner,
|
|
8
|
+
AnonymousTaskStatus,
|
|
9
|
+
create_anonymous_a2a_application,
|
|
10
|
+
)
|
|
11
|
+
from .anonymous_native import EgAnonymousTaskReadPort
|
|
3
12
|
from .application import (
|
|
4
13
|
A2AAuthenticator,
|
|
5
14
|
AmbientA2AAuthenticator,
|
|
@@ -41,6 +50,13 @@ from .work_items import (
|
|
|
41
50
|
)
|
|
42
51
|
|
|
43
52
|
__all__ = [
|
|
53
|
+
"EgAnonymousTaskReadPort",
|
|
54
|
+
"AnonymousCaller",
|
|
55
|
+
"AnonymousNativeReadPort",
|
|
56
|
+
"AnonymousReadPolicy",
|
|
57
|
+
"AnonymousTaskReadOwner",
|
|
58
|
+
"AnonymousTaskStatus",
|
|
59
|
+
"create_anonymous_a2a_application",
|
|
44
60
|
"AdmittedA2AApp",
|
|
45
61
|
"create_admitted_a2a_app",
|
|
46
62
|
"A2AAgentCard",
|
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
"""Explicit anonymous task reads; never an authenticated session or fallback.
|
|
2
|
+
|
|
3
|
+
Only the configured shared-local namespace is available. Native tokenless client
|
|
4
|
+
provisioning remains the host's responsibility; this module creates no client,
|
|
5
|
+
credentials, verified claims or deployment settings. Mutation is not supported.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
import contextvars
|
|
12
|
+
import hashlib
|
|
13
|
+
import inspect
|
|
14
|
+
import ipaddress
|
|
15
|
+
import json
|
|
16
|
+
from abc import ABC, abstractmethod
|
|
17
|
+
from contextlib import contextmanager
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
from typing import Any
|
|
20
|
+
from urllib.parse import urlsplit
|
|
21
|
+
|
|
22
|
+
from fastapi import FastAPI, Request
|
|
23
|
+
from fastapi.responses import JSONResponse
|
|
24
|
+
|
|
25
|
+
from .authority import WorkItemA2AAuthority
|
|
26
|
+
from .service import A2AService
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass(frozen=True, slots=True)
|
|
30
|
+
class AnonymousReadPolicy:
|
|
31
|
+
origin: str
|
|
32
|
+
tenant: str
|
|
33
|
+
revision: str
|
|
34
|
+
operations: frozenset[str] = frozenset()
|
|
35
|
+
|
|
36
|
+
def __post_init__(self) -> None:
|
|
37
|
+
parsed = urlsplit(self.origin)
|
|
38
|
+
try:
|
|
39
|
+
local = ipaddress.ip_address(parsed.hostname or "").is_loopback
|
|
40
|
+
port = parsed.port
|
|
41
|
+
except ValueError:
|
|
42
|
+
local, port = False, None
|
|
43
|
+
if (
|
|
44
|
+
not local
|
|
45
|
+
or parsed.scheme != "http"
|
|
46
|
+
or port is None
|
|
47
|
+
or parsed.username is not None
|
|
48
|
+
or parsed.password is not None
|
|
49
|
+
or parsed.path
|
|
50
|
+
or parsed.query
|
|
51
|
+
or parsed.fragment
|
|
52
|
+
or self.origin != f"http://{parsed.netloc}"
|
|
53
|
+
or type(self.operations) is not frozenset
|
|
54
|
+
or not self.operations <= {"tasks/get"}
|
|
55
|
+
):
|
|
56
|
+
raise ValueError("Explicit loopback read policy required")
|
|
57
|
+
if self.tenant != "local":
|
|
58
|
+
raise ValueError("Anonymous namespace is local only")
|
|
59
|
+
for value in (self.tenant, self.revision):
|
|
60
|
+
if (
|
|
61
|
+
type(value) is not str
|
|
62
|
+
or not value
|
|
63
|
+
or len(value) > 128
|
|
64
|
+
or not value.isascii()
|
|
65
|
+
or not all(c.isalnum() or c in "-_" for c in value)
|
|
66
|
+
):
|
|
67
|
+
raise ValueError("Explicit namespace and revision required")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@dataclass(frozen=True, slots=True)
|
|
71
|
+
class AnonymousCaller:
|
|
72
|
+
"""Descriptive shared namespace, not a person, scope grant or GraphSession."""
|
|
73
|
+
|
|
74
|
+
tenant: str
|
|
75
|
+
policy_revision: str
|
|
76
|
+
task_id: str
|
|
77
|
+
owner_ref: str
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def authenticated(self) -> bool:
|
|
81
|
+
return False
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@dataclass(frozen=True, slots=True)
|
|
85
|
+
class AnonymousTaskStatus:
|
|
86
|
+
"""Required native ownership evidence, not the existing EG caller view.
|
|
87
|
+
|
|
88
|
+
The current EG WorkItem view omits tenant and native ownership evidence.
|
|
89
|
+
An adapter must not fill those fields from its request to claim support.
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
work_item_id: str
|
|
93
|
+
run_id: str
|
|
94
|
+
tenant: str
|
|
95
|
+
owner_ref: str
|
|
96
|
+
status: str
|
|
97
|
+
authority_mode: str
|
|
98
|
+
context_id: str
|
|
99
|
+
|
|
100
|
+
def __post_init__(self) -> None:
|
|
101
|
+
for value in (
|
|
102
|
+
self.work_item_id,
|
|
103
|
+
self.run_id,
|
|
104
|
+
self.tenant,
|
|
105
|
+
self.owner_ref,
|
|
106
|
+
self.status,
|
|
107
|
+
self.authority_mode,
|
|
108
|
+
self.context_id,
|
|
109
|
+
):
|
|
110
|
+
if type(value) is not str or not value or len(value) > 256:
|
|
111
|
+
raise ValueError("Invalid native anonymous evidence")
|
|
112
|
+
WorkItemA2AAuthority._work_item_id(self.run_id)
|
|
113
|
+
from .authority import _STATE_MAP
|
|
114
|
+
from .models import A2ATaskStatus
|
|
115
|
+
|
|
116
|
+
if self.status not in _STATE_MAP or self.authority_mode not in {
|
|
117
|
+
"none",
|
|
118
|
+
"verified",
|
|
119
|
+
}:
|
|
120
|
+
raise ValueError("Invalid native status")
|
|
121
|
+
from .models import A2ATask
|
|
122
|
+
|
|
123
|
+
A2ATask(
|
|
124
|
+
id=self.run_id,
|
|
125
|
+
context_id=self.context_id,
|
|
126
|
+
status=A2ATaskStatus(state=_STATE_MAP[self.status]),
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class AnonymousNativeReadPort(ABC):
|
|
131
|
+
"""Tokenless native contract; generic signed EG clients do not implement it.
|
|
132
|
+
|
|
133
|
+
The producer must enforce the bound namespace and anonymous owner before
|
|
134
|
+
reading. No released implementation is qualified by this source contract.
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
@abstractmethod
|
|
138
|
+
async def get(self, caller: AnonymousCaller) -> AnonymousTaskStatus | None:
|
|
139
|
+
raise NotImplementedError
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
@dataclass(slots=True)
|
|
143
|
+
class _ReadBinding:
|
|
144
|
+
caller: AnonymousCaller
|
|
145
|
+
task: Any
|
|
146
|
+
request: Request
|
|
147
|
+
snapshot: tuple[Any, ...]
|
|
148
|
+
used: bool = False
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class AnonymousTaskReadOwner:
|
|
152
|
+
"""Own one exact public WorkItem reader and a revocable local read policy."""
|
|
153
|
+
|
|
154
|
+
def __init__(
|
|
155
|
+
self, *, mode: str, policy: AnonymousReadPolicy, work_items: Any
|
|
156
|
+
) -> None:
|
|
157
|
+
if mode != "none" or type(policy) is not AnonymousReadPolicy:
|
|
158
|
+
raise ValueError("Explicit anonymous mode required")
|
|
159
|
+
if not isinstance(
|
|
160
|
+
work_items, AnonymousNativeReadPort
|
|
161
|
+
) or not inspect.iscoroutinefunction(work_items.get):
|
|
162
|
+
raise ValueError("Native WorkItem read port required")
|
|
163
|
+
self._policy = policy
|
|
164
|
+
self._work_items = work_items
|
|
165
|
+
self._revoked = False
|
|
166
|
+
self._active = 0
|
|
167
|
+
self._request: contextvars.ContextVar[Any] = contextvars.ContextVar(
|
|
168
|
+
"anonymous_request", default=None
|
|
169
|
+
)
|
|
170
|
+
self._binding: contextvars.ContextVar[_ReadBinding | None] = (
|
|
171
|
+
contextvars.ContextVar("anonymous_task_read", default=None)
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
@property
|
|
175
|
+
def policy(self) -> AnonymousReadPolicy:
|
|
176
|
+
return self._policy
|
|
177
|
+
|
|
178
|
+
def revoke(self) -> None:
|
|
179
|
+
self._revoked = True
|
|
180
|
+
|
|
181
|
+
def _deadline(self) -> float:
|
|
182
|
+
binding = self._request.get()
|
|
183
|
+
if binding is None:
|
|
184
|
+
raise PermissionError("Anonymous request binding required")
|
|
185
|
+
task = asyncio.current_task()
|
|
186
|
+
if task is None:
|
|
187
|
+
raise PermissionError("Anonymous request task required")
|
|
188
|
+
if task.cancelling():
|
|
189
|
+
raise asyncio.CancelledError
|
|
190
|
+
if asyncio.get_running_loop().time() >= binding[3]:
|
|
191
|
+
raise TimeoutError("Anonymous request expired")
|
|
192
|
+
return binding[3]
|
|
193
|
+
|
|
194
|
+
def _check(self, binding: _ReadBinding) -> None:
|
|
195
|
+
self._deadline()
|
|
196
|
+
if (
|
|
197
|
+
self._revoked
|
|
198
|
+
or self._binding.get() is not binding
|
|
199
|
+
or asyncio.current_task() is not binding.task
|
|
200
|
+
or self._snapshot(binding.request) != binding.snapshot
|
|
201
|
+
or self._request.get()[:3]
|
|
202
|
+
!= (binding.request, binding.task, binding.snapshot)
|
|
203
|
+
):
|
|
204
|
+
raise PermissionError("Anonymous read unavailable")
|
|
205
|
+
|
|
206
|
+
@staticmethod
|
|
207
|
+
def _snapshot(request: Request) -> tuple[Any, ...]:
|
|
208
|
+
scope = request.scope
|
|
209
|
+
return (
|
|
210
|
+
(id(scope),)
|
|
211
|
+
+ tuple(
|
|
212
|
+
scope.get(key)
|
|
213
|
+
for key in (
|
|
214
|
+
"type",
|
|
215
|
+
"scheme",
|
|
216
|
+
"method",
|
|
217
|
+
"path",
|
|
218
|
+
"root_path",
|
|
219
|
+
"query_string",
|
|
220
|
+
"client",
|
|
221
|
+
"server",
|
|
222
|
+
)
|
|
223
|
+
)
|
|
224
|
+
+ (tuple(scope.get("headers", ())),)
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
@contextmanager
|
|
228
|
+
def request_scope(self, request: Request):
|
|
229
|
+
self._validate_request(request)
|
|
230
|
+
if self._revoked or self._active >= 4 or self._request.get() is not None:
|
|
231
|
+
raise PermissionError("Anonymous read capacity unavailable")
|
|
232
|
+
snapshot = self._snapshot(request)
|
|
233
|
+
self._active += 1
|
|
234
|
+
token = self._request.set(
|
|
235
|
+
(
|
|
236
|
+
request,
|
|
237
|
+
asyncio.current_task(),
|
|
238
|
+
snapshot,
|
|
239
|
+
asyncio.get_running_loop().time() + 5,
|
|
240
|
+
)
|
|
241
|
+
)
|
|
242
|
+
try:
|
|
243
|
+
yield snapshot
|
|
244
|
+
finally:
|
|
245
|
+
self._request.reset(token)
|
|
246
|
+
self._active -= 1
|
|
247
|
+
|
|
248
|
+
def _validate_request(self, request: Request) -> None:
|
|
249
|
+
scope = request.scope
|
|
250
|
+
try:
|
|
251
|
+
local = ipaddress.ip_address(scope["client"][0]).is_loopback
|
|
252
|
+
except (KeyError, TypeError, ValueError):
|
|
253
|
+
local = False
|
|
254
|
+
headers = request.headers
|
|
255
|
+
forbidden = {
|
|
256
|
+
"authorization",
|
|
257
|
+
"cookie",
|
|
258
|
+
"forwarded",
|
|
259
|
+
"x-forwarded-host",
|
|
260
|
+
"x-forwarded-for",
|
|
261
|
+
"x-forwarded-proto",
|
|
262
|
+
}
|
|
263
|
+
expected = urlsplit(self.policy.origin)
|
|
264
|
+
if (
|
|
265
|
+
not local
|
|
266
|
+
or scope.get("scheme") != expected.scheme
|
|
267
|
+
or any(name in headers for name in forbidden)
|
|
268
|
+
or headers.getlist("host") != [expected.netloc]
|
|
269
|
+
or headers.getlist("origin") != [self.policy.origin]
|
|
270
|
+
or headers.getlist("x-arbora-anonymous") != ["1"]
|
|
271
|
+
or headers.getlist("content-type") != ["application/json"]
|
|
272
|
+
):
|
|
273
|
+
raise PermissionError("Anonymous ingress refused")
|
|
274
|
+
|
|
275
|
+
@contextmanager
|
|
276
|
+
def admission(self, request: Request, task_id: str):
|
|
277
|
+
self._validate_request(request)
|
|
278
|
+
expected = self._request.get()
|
|
279
|
+
if expected is None or expected[:3] != (
|
|
280
|
+
request,
|
|
281
|
+
asyncio.current_task(),
|
|
282
|
+
self._snapshot(request),
|
|
283
|
+
):
|
|
284
|
+
raise PermissionError("Anonymous request binding required")
|
|
285
|
+
WorkItemA2AAuthority._work_item_id(task_id)
|
|
286
|
+
if (
|
|
287
|
+
self._revoked
|
|
288
|
+
or "tasks/get" not in self.policy.operations
|
|
289
|
+
or self._binding.get() is not None
|
|
290
|
+
):
|
|
291
|
+
raise PermissionError("Anonymous read unavailable")
|
|
292
|
+
owner_ref = (
|
|
293
|
+
"anonymous:sha256:"
|
|
294
|
+
+ hashlib.sha256(self.policy.tenant.encode()).hexdigest()
|
|
295
|
+
)
|
|
296
|
+
binding = _ReadBinding(
|
|
297
|
+
AnonymousCaller(
|
|
298
|
+
self.policy.tenant, self.policy.revision, task_id, owner_ref
|
|
299
|
+
),
|
|
300
|
+
asyncio.current_task(),
|
|
301
|
+
request,
|
|
302
|
+
self._snapshot(request),
|
|
303
|
+
)
|
|
304
|
+
token = self._binding.set(binding)
|
|
305
|
+
try:
|
|
306
|
+
yield binding.caller
|
|
307
|
+
finally:
|
|
308
|
+
self._binding.reset(token)
|
|
309
|
+
|
|
310
|
+
async def dispatch(
|
|
311
|
+
self,
|
|
312
|
+
*,
|
|
313
|
+
message: Any,
|
|
314
|
+
idempotency_key: str,
|
|
315
|
+
decision: Any,
|
|
316
|
+
blocking: bool = True,
|
|
317
|
+
):
|
|
318
|
+
raise PermissionError("Anonymous mutation is unavailable")
|
|
319
|
+
|
|
320
|
+
async def list(self, *, cursor: str | None, limit: int):
|
|
321
|
+
raise PermissionError("Anonymous listing is unavailable")
|
|
322
|
+
|
|
323
|
+
async def cancel(self, task_id: str):
|
|
324
|
+
raise PermissionError("Anonymous cancellation is unavailable")
|
|
325
|
+
|
|
326
|
+
async def get(self, task_id: str):
|
|
327
|
+
binding = self._binding.get()
|
|
328
|
+
if binding is None:
|
|
329
|
+
raise PermissionError("Anonymous admission required")
|
|
330
|
+
self._check(binding)
|
|
331
|
+
if binding.used or task_id != binding.caller.task_id:
|
|
332
|
+
raise PermissionError("Anonymous read binding changed")
|
|
333
|
+
binding.used = True
|
|
334
|
+
from arbora.api.contracts.session import suspend_session
|
|
335
|
+
from arbora.security.actor_context import suspend_actor
|
|
336
|
+
|
|
337
|
+
# Stay on the admitting task. Cancellation holds capacity until the
|
|
338
|
+
# provider has actually unwound; no detached thread retains authority.
|
|
339
|
+
with suspend_session(), suspend_actor():
|
|
340
|
+
async with asyncio.timeout_at(self._deadline()) as timeout:
|
|
341
|
+
try:
|
|
342
|
+
item = await self._work_items.get(binding.caller)
|
|
343
|
+
except ValueError as exc:
|
|
344
|
+
raise RuntimeError("Native read evidence unavailable") from exc
|
|
345
|
+
if timeout.expired():
|
|
346
|
+
raise TimeoutError("Anonymous request expired")
|
|
347
|
+
self._check(binding)
|
|
348
|
+
caller = binding.caller
|
|
349
|
+
if (
|
|
350
|
+
type(item) is not AnonymousTaskStatus
|
|
351
|
+
or item.run_id != task_id
|
|
352
|
+
or item.tenant != caller.tenant
|
|
353
|
+
or item.owner_ref != caller.owner_ref
|
|
354
|
+
or item.authority_mode != "none"
|
|
355
|
+
):
|
|
356
|
+
return None
|
|
357
|
+
from .authority import _STATE_MAP
|
|
358
|
+
from .models import A2ATask, A2ATaskStatus
|
|
359
|
+
|
|
360
|
+
state = _STATE_MAP.get(item.status)
|
|
361
|
+
if state is None:
|
|
362
|
+
raise ValueError("Unknown task state")
|
|
363
|
+
# Status only: no reply cache, routing metadata or context ownership
|
|
364
|
+
# has been qualified by this bounded native read contract.
|
|
365
|
+
return A2ATask(
|
|
366
|
+
id=task_id, context_id=item.context_id, status=A2ATaskStatus(state=state)
|
|
367
|
+
)
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def _unique_object(pairs):
|
|
371
|
+
result = {}
|
|
372
|
+
for key, value in pairs:
|
|
373
|
+
if key in result:
|
|
374
|
+
raise ValueError("Duplicate JSON field")
|
|
375
|
+
result[key] = value
|
|
376
|
+
return result
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
async def _read_payload(
|
|
380
|
+
request: Request, owner: AnonymousTaskReadOwner, service: A2AService
|
|
381
|
+
) -> JSONResponse:
|
|
382
|
+
from .application import _error, _GetTaskParams, _unary_response
|
|
383
|
+
|
|
384
|
+
request_id = None
|
|
385
|
+
try:
|
|
386
|
+
owner._validate_request(request)
|
|
387
|
+
raw = bytearray()
|
|
388
|
+
async for chunk in request.stream():
|
|
389
|
+
if len(raw) + len(chunk) > 16384:
|
|
390
|
+
return _error(None, -32600, "Request too large", 413)
|
|
391
|
+
raw.extend(chunk)
|
|
392
|
+
body = json.loads(raw, object_pairs_hook=_unique_object)
|
|
393
|
+
if (
|
|
394
|
+
type(body) is not dict
|
|
395
|
+
or set(body) != {"jsonrpc", "id", "method", "params"}
|
|
396
|
+
or body["jsonrpc"] != "2.0"
|
|
397
|
+
):
|
|
398
|
+
raise ValueError("Invalid envelope")
|
|
399
|
+
request_id = body["id"]
|
|
400
|
+
if type(request_id) not in {str, int} or len(str(request_id)) > 128:
|
|
401
|
+
request_id = None
|
|
402
|
+
raise ValueError("Invalid identifier")
|
|
403
|
+
if body["method"] != "tasks/get":
|
|
404
|
+
raise PermissionError("Operation unavailable")
|
|
405
|
+
params = _GetTaskParams.model_validate(body["params"])
|
|
406
|
+
if params.include_committed_event:
|
|
407
|
+
raise PermissionError("Committed reply authority unavailable")
|
|
408
|
+
with owner.admission(request, params.id):
|
|
409
|
+
result = await service.get_task(params.id)
|
|
410
|
+
return (
|
|
411
|
+
_unary_response(result, request_id)
|
|
412
|
+
if result is not None
|
|
413
|
+
else _error(request_id, -32001, "Task not found", 404)
|
|
414
|
+
)
|
|
415
|
+
except PermissionError:
|
|
416
|
+
return _error(request_id, -32001, "Anonymous read refused", 403)
|
|
417
|
+
except (ValueError, TypeError):
|
|
418
|
+
return _error(request_id, -32602, "Invalid params")
|
|
419
|
+
except Exception:
|
|
420
|
+
return _error(request_id, -32014, "Task read unavailable", 503)
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
def create_anonymous_a2a_application(
|
|
424
|
+
*, owner: AnonymousTaskReadOwner, service: A2AService
|
|
425
|
+
) -> FastAPI:
|
|
426
|
+
"""Create an opt-in read-only served seam; never modify the verified app."""
|
|
427
|
+
if (
|
|
428
|
+
type(owner) is not AnonymousTaskReadOwner
|
|
429
|
+
or type(service) is not A2AService
|
|
430
|
+
or service.authority is not owner
|
|
431
|
+
):
|
|
432
|
+
raise ValueError("The exact same anonymous task owner is required")
|
|
433
|
+
app = FastAPI(openapi_url=None, docs_url=None, redoc_url=None)
|
|
434
|
+
|
|
435
|
+
@app.post("/a2a")
|
|
436
|
+
async def read_task(request: Request):
|
|
437
|
+
from .application import _error
|
|
438
|
+
|
|
439
|
+
try:
|
|
440
|
+
with owner.request_scope(request) as snapshot:
|
|
441
|
+
async with asyncio.timeout_at(owner._deadline()) as timeout:
|
|
442
|
+
result = await _read_payload(request, owner, service)
|
|
443
|
+
if timeout.expired():
|
|
444
|
+
raise TimeoutError("Anonymous request expired")
|
|
445
|
+
owner._deadline()
|
|
446
|
+
if owner._snapshot(request) != snapshot or owner._revoked:
|
|
447
|
+
raise PermissionError("Anonymous request changed")
|
|
448
|
+
return result
|
|
449
|
+
except PermissionError:
|
|
450
|
+
return _error(None, -32001, "Anonymous read refused", 403)
|
|
451
|
+
except TimeoutError:
|
|
452
|
+
return _error(None, -32014, "Task read unavailable", 503)
|
|
453
|
+
|
|
454
|
+
return app
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""Source adapter to EG's existing owner-bound original run-admission read.
|
|
2
|
+
|
|
3
|
+
No native deployment or token is created here. The server's anonymous principal
|
|
4
|
+
and immutable run-owner binding, not caller metadata, own this read decision.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import hashlib
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from epistemic_graph.client import EpistemicGraphClient
|
|
13
|
+
from epistemic_graph.generated.coordination import (
|
|
14
|
+
decode_get_run_work_item,
|
|
15
|
+
send_get_run_work_item,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
from .anonymous import AnonymousCaller, AnonymousNativeReadPort, AnonymousTaskStatus
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class EgAnonymousTaskReadPort(AnonymousNativeReadPort):
|
|
22
|
+
"""Use GetRunWorkItem on an already-configured local no-auth client only."""
|
|
23
|
+
|
|
24
|
+
def __init__(self, client: EpistemicGraphClient, *, graph: str) -> None:
|
|
25
|
+
if (
|
|
26
|
+
type(client) is not EpistemicGraphClient
|
|
27
|
+
or type(graph) is not str
|
|
28
|
+
or not graph
|
|
29
|
+
or len(graph) > 128
|
|
30
|
+
):
|
|
31
|
+
raise ValueError("Exact local native client and graph required")
|
|
32
|
+
self._client = client
|
|
33
|
+
self._graph = graph
|
|
34
|
+
self._check_mode()
|
|
35
|
+
|
|
36
|
+
def _check_mode(self) -> None:
|
|
37
|
+
if self._client.auth_mode != "none" or self._client.authenticated is not False:
|
|
38
|
+
raise PermissionError("Explicit native anonymous mode required")
|
|
39
|
+
|
|
40
|
+
async def get(self, caller: AnonymousCaller) -> AnonymousTaskStatus | None:
|
|
41
|
+
self._check_mode()
|
|
42
|
+
if type(caller) is not AnonymousCaller or caller.tenant != "local":
|
|
43
|
+
raise PermissionError("Native anonymous namespace is local only")
|
|
44
|
+
if await self._client.supports("GetRunWorkItem") is not True:
|
|
45
|
+
raise RuntimeError("Native owner-bound reads unavailable")
|
|
46
|
+
self._check_mode()
|
|
47
|
+
result = await send_get_run_work_item(
|
|
48
|
+
self._client,
|
|
49
|
+
{"tenant": "local", "run_id": caller.task_id},
|
|
50
|
+
graph=self._graph,
|
|
51
|
+
)
|
|
52
|
+
decode_get_run_work_item(result)
|
|
53
|
+
value = result.payload
|
|
54
|
+
self._check_mode()
|
|
55
|
+
if value is None:
|
|
56
|
+
return None
|
|
57
|
+
return self._project(value, caller)
|
|
58
|
+
|
|
59
|
+
def _project(self, value: Any, caller: AnonymousCaller) -> AnonymousTaskStatus:
|
|
60
|
+
admission = value["admission"]
|
|
61
|
+
context = admission["context"]
|
|
62
|
+
item = value["work_item"]
|
|
63
|
+
if (
|
|
64
|
+
admission["run_id"] != caller.task_id
|
|
65
|
+
or context["tenant_id"] != "local"
|
|
66
|
+
or context["graph"] != self._graph
|
|
67
|
+
or admission["work_item_id"] is not None
|
|
68
|
+
or admission["kind"] != "orchestrator_task"
|
|
69
|
+
or item["kind"] != "orchestrator_task"
|
|
70
|
+
):
|
|
71
|
+
raise PermissionError("Native anonymous run binding mismatch")
|
|
72
|
+
# GetRunWorkItem independently binds the transport's server-created
|
|
73
|
+
# anonymous principal to the immutable native owner. Subject/agent/scopes
|
|
74
|
+
# in original request context are provenance, never used as grants here.
|
|
75
|
+
owner_ref = "anonymous:sha256:" + hashlib.sha256(b"local").hexdigest()
|
|
76
|
+
return AnonymousTaskStatus(
|
|
77
|
+
work_item_id=item["work_item_id"],
|
|
78
|
+
run_id=admission["run_id"],
|
|
79
|
+
tenant=context["tenant_id"],
|
|
80
|
+
owner_ref=owner_ref,
|
|
81
|
+
status=item["status"],
|
|
82
|
+
authority_mode="none",
|
|
83
|
+
context_id=admission["metadata"]["a2a_context_id"],
|
|
84
|
+
)
|
|
@@ -299,6 +299,10 @@ _ERROR_CODES: dict[type[Exception], tuple[int, int]] = {
|
|
|
299
299
|
|
|
300
300
|
def _application_error(request_id: Any, error: Exception) -> JSONResponse:
|
|
301
301
|
"""Translate known service failures without echoing caller input."""
|
|
302
|
+
from arbora.api.invoke.pipeline import OperationRefused
|
|
303
|
+
|
|
304
|
+
if isinstance(error, OperationRefused) and error.code == "UPGRADE_REQUIRED":
|
|
305
|
+
return _error(request_id, -32013, "UPGRADE_REQUIRED: native run ownership", 501)
|
|
302
306
|
mapped = _ERROR_CODES.get(type(error))
|
|
303
307
|
if mapped is not None:
|
|
304
308
|
code, status = mapped
|