agentengine-sdk-python 0.8.5__py3-none-any.whl → 0.8.6__py3-none-any.whl
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.
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +12 -8
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/RECORD +823 -388
- ksadk/_async_iterators.py +79 -0
- ksadk/_build_provenance.json +1 -1
- ksadk/_model_anthropic.py +49 -0
- ksadk/_model_input.py +86 -0
- ksadk/_model_json.py +40 -0
- ksadk/_model_reasoning.py +17 -0
- ksadk/_model_refusal.py +20 -0
- ksadk/_model_sse.py +163 -0
- ksadk/a2a/__init__.py +157 -167
- ksadk/a2a/_invocation_state.py +86 -0
- ksadk/a2a/_space_client_events.py +33 -22
- ksadk/a2a/adk.py +194 -0
- ksadk/a2a/adk_invocation_context.py +242 -0
- ksadk/a2a/adk_runtime.py +126 -0
- ksadk/a2a/adk_tools.py +319 -0
- ksadk/a2a/bootstrap.py +149 -23
- ksadk/a2a/build_validation.py +147 -0
- ksadk/a2a/card.py +23 -15
- ksadk/a2a/codex.py +160 -0
- ksadk/a2a/codex_checkpoint.py +111 -0
- ksadk/a2a/codex_recovery.py +96 -0
- ksadk/a2a/codex_recovery_events.py +123 -0
- ksadk/a2a/codex_runtime.py +198 -0
- ksadk/a2a/codex_session_checkpoint.py +162 -0
- ksadk/a2a/composition.py +88 -0
- ksadk/a2a/context_store.py +118 -19
- ksadk/a2a/control_plane.py +108 -106
- ksadk/a2a/event_adapter.py +92 -193
- ksadk/a2a/executor.py +257 -85
- ksadk/a2a/exposure.py +106 -0
- ksadk/a2a/external_transport.py +3 -4
- ksadk/a2a/identity.py +106 -12
- ksadk/a2a/ids.py +14 -3
- ksadk/a2a/inbound_kernel.py +133 -0
- ksadk/a2a/interaction_wire.py +76 -0
- ksadk/a2a/invocation_checkpoint.py +274 -0
- ksadk/a2a/invocation_policy.py +87 -0
- ksadk/a2a/invocation_publication.py +210 -0
- ksadk/a2a/invocation_service.py +972 -0
- ksadk/a2a/invocation_types.py +459 -0
- ksadk/a2a/kernel_task_adapter.py +259 -0
- ksadk/a2a/langgraph.py +20 -7
- ksadk/a2a/langgraph_invocation_context.py +136 -0
- ksadk/a2a/langgraph_managed.py +150 -0
- ksadk/a2a/langgraph_recovery.py +32 -0
- ksadk/a2a/langgraph_runtime.py +89 -0
- ksadk/a2a/langgraph_tool_runtime.py +132 -0
- ksadk/a2a/langgraph_tools.py +63 -0
- ksadk/a2a/message_digest.py +40 -0
- ksadk/a2a/platform.py +389 -0
- ksadk/a2a/policy_refs.py +13 -0
- ksadk/a2a/presentation.py +402 -0
- ksadk/a2a/product_kernel_facts.py +177 -0
- ksadk/a2a/product_key.py +99 -0
- ksadk/a2a/protocol_errors.py +116 -0
- ksadk/a2a/result_text.py +49 -0
- ksadk/a2a/resume_store.py +93 -3
- ksadk/a2a/routes.py +6 -1
- ksadk/a2a/runtime_approval.py +198 -0
- ksadk/a2a/runtime_input.py +151 -0
- ksadk/a2a/server.py +16 -7
- ksadk/a2a/space_client.py +101 -16
- ksadk/a2a/task_adapter.py +19 -5
- ksadk/a2a/task_event_dispatcher.py +39 -2
- ksadk/a2a/task_event_outbox.py +215 -0
- ksadk/a2a/task_event_outbox_owned.py +130 -0
- ksadk/a2a/task_store.py +37 -0
- ksadk/a2a/tool_activity.py +176 -0
- ksadk/a2a/workload_tokens.py +134 -0
- ksadk/api/client.py +32 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +83 -106
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +2 -0
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_invoke.py +45 -92
- ksadk/cli/cmd_studio.py +5 -1
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/runtime_bootstrap.py +27 -5
- ksadk/codex/_expert_request_reader.py +48 -0
- ksadk/codex/a2a_tools.py +140 -0
- ksadk/codex/async_approval.py +169 -0
- ksadk/codex/async_client.py +938 -0
- ksadk/codex/async_proxy.py +216 -0
- ksadk/codex/base_runtime.py +25 -0
- ksadk/codex/client.py +3 -1048
- ksadk/codex/client_payloads.py +85 -0
- ksadk/codex/rollout_checkpoint.py +264 -0
- ksadk/codex/runtime.py +290 -54
- ksadk/common/auth.py +2 -2
- ksadk/common/cloud_headers.py +36 -0
- ksadk/common/diagnostics.py +34 -0
- ksadk/common/kop_client.py +2 -1
- ksadk/configs/env_registry.py +106 -127
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +53 -5
- ksadk/configs/global_config.py +1 -0
- ksadk/configs/settings.py +6 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachments.py +53 -15
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +30 -125
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_payloads.py +4 -0
- ksadk/conversations/runtime_persistence.py +192 -24
- ksadk/conversations/runtime_preparation.py +85 -6
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/tool_receipt_resume.py +387 -0
- ksadk/conversations/tool_receipts.py +32 -0
- ksadk/deployment/env_forward.py +5 -0
- ksadk/deployment/manager.py +15 -6
- ksadk/deployment/providers/serverless.py +76 -136
- ksadk/deployment/providers/serverless_payloads.py +122 -0
- ksadk/evaluation/agent_eval_client.py +2 -1
- ksadk/evaluation/contracts.py +78 -3
- ksadk/evaluation/evaluators.py +166 -1
- ksadk/evaluation/evidence.py +271 -4
- ksadk/evaluation/local_adapter.py +76 -12
- ksadk/evaluation/studio_build_adapter.py +73 -9
- ksadk/events/adapters/_a2a_checkpoint.py +151 -0
- ksadk/events/adapters/_a2a_snapshot.py +18 -14
- ksadk/events/adapters/_a2a_support.py +15 -3
- ksadk/events/adapters/_a2a_tool_activity.py +123 -0
- ksadk/events/adapters/_codex_errors.py +49 -0
- ksadk/events/adapters/_langgraph_support.py +12 -1
- ksadk/events/adapters/a2a.py +54 -26
- ksadk/events/adapters/adk.py +188 -30
- ksadk/events/adapters/codex.py +33 -7
- ksadk/events/adapters/langgraph.py +16 -6
- ksadk/events/canonical.py +5 -0
- ksadk/events/canonical_store.py +200 -4
- ksadk/events/reducer.py +82 -0
- ksadk/events/run_authority.py +176 -0
- ksadk/harness/__init__.py +4 -0
- ksadk/harness/artifact_adapters/__init__.py +1 -0
- ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
- ksadk/harness/artifact_adapters/native_search.py +249 -0
- ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
- ksadk/harness/artifact_adapters/native_store.py +115 -0
- ksadk/harness/artifact_adapters/native_tool.py +222 -0
- ksadk/harness/artifact_store.py +26 -9
- ksadk/harness/browser_adapters/__init__.py +6 -0
- ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
- ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
- ksadk/harness/browser_adapters/native_playwright.py +953 -0
- ksadk/harness/browser_adapters/native_vision.py +295 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +104 -9
- ksadk/harness/compaction_record.py +31 -0
- ksadk/harness/compiler.py +3 -3
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/contract.py +9 -11
- ksadk/harness/context_engine.py +18 -33
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/diagnostic_adapters/__init__.py +1 -0
- ksadk/harness/diagnostic_adapters/contracts.py +70 -0
- ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
- ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
- ksadk/harness/engine/completion_guard.py +16 -1
- ksadk/harness/engine/context_pipeline.py +864 -92
- ksadk/harness/engine/graph_builder.py +123 -630
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +126 -8
- ksadk/harness/engine/mcp_disclosure.py +65 -114
- ksadk/harness/engine/phases/__init__.py +6 -0
- ksadk/harness/engine/phases/context.py +48 -0
- ksadk/harness/engine/phases/interaction.py +31 -0
- ksadk/harness/engine/phases/reason.py +552 -0
- ksadk/harness/engine/phases/tools.py +638 -0
- ksadk/harness/engine/policy_runtime.py +21 -10
- ksadk/harness/engine/postgres_checkpointer.py +325 -2
- ksadk/harness/engine/run_control_bridge.py +21 -1
- ksadk/harness/engine/run_types.py +10 -0
- ksadk/harness/engine/skill_disclosure.py +98 -12
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +18 -1
- ksadk/harness/engine/tool_dispatch.py +112 -7
- ksadk/harness/events.py +39 -2
- ksadk/harness/execution_policy.py +10 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/loop/reason.py +281 -36
- ksadk/harness/loop/tools.py +157 -12
- ksadk/harness/managed_runtime.py +254 -94
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +33 -0
- ksadk/harness/micro_compact.py +69 -0
- ksadk/harness/model_adapters/__init__.py +1 -0
- ksadk/harness/model_adapters/native_mcp_media.py +100 -0
- ksadk/harness/model_adapters/native_mcp_result.py +36 -0
- ksadk/harness/model_adapters/native_openai.py +703 -0
- ksadk/harness/model_capability.py +223 -8
- ksadk/harness/model_provider.py +214 -4
- ksadk/harness/multimodal.py +57 -0
- ksadk/harness/native/__init__.py +1 -0
- ksadk/harness/native/activation_contract.py +25 -0
- ksadk/harness/native/activation_recovery.py +29 -0
- ksadk/harness/native/adapters.py +291 -0
- ksadk/harness/native/artifact_contract.py +14 -0
- ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
- ksadk/harness/native/artifact_read_capacity.py +182 -0
- ksadk/harness/native/artifact_read_contract.py +27 -0
- ksadk/harness/native/artifact_runtime.py +408 -0
- ksadk/harness/native/artifact_search_capacity.py +206 -0
- ksadk/harness/native/artifact_search_contract.py +40 -0
- ksadk/harness/native/artifact_single_read_capacity.py +170 -0
- ksadk/harness/native/browser_contract.py +229 -0
- ksadk/harness/native/browser_recovery.py +183 -0
- ksadk/harness/native/capabilities.py +204 -0
- ksadk/harness/native/child_approval.py +60 -0
- ksadk/harness/native/child_budget.py +136 -0
- ksadk/harness/native/child_cancellation.py +80 -0
- ksadk/harness/native/child_input.py +98 -0
- ksadk/harness/native/child_input_runtime.py +59 -0
- ksadk/harness/native/child_interruption.py +81 -0
- ksadk/harness/native/child_lifecycle.py +246 -0
- ksadk/harness/native/child_lifecycle_contract.py +91 -0
- ksadk/harness/native/child_notifications.py +75 -0
- ksadk/harness/native/child_promotion.py +66 -0
- ksadk/harness/native/command_runtime.py +99 -0
- ksadk/harness/native/completion.py +302 -0
- ksadk/harness/native/completion_text.py +116 -0
- ksadk/harness/native/context.py +358 -0
- ksadk/harness/native/context_artifact_page.py +75 -0
- ksadk/harness/native/context_compaction_projection.py +131 -0
- ksadk/harness/native/context_contributions.py +320 -0
- ksadk/harness/native/context_contributor_contract.py +133 -0
- ksadk/harness/native/context_driver.py +820 -0
- ksadk/harness/native/context_fresh_tools.py +49 -0
- ksadk/harness/native/context_history.py +272 -0
- ksadk/harness/native/context_microcompact.py +61 -0
- ksadk/harness/native/context_partial_summary.py +58 -0
- ksadk/harness/native/context_partition.py +492 -0
- ksadk/harness/native/context_pruning.py +275 -0
- ksadk/harness/native/context_reduction.py +60 -0
- ksadk/harness/native/context_replay.py +148 -0
- ksadk/harness/native/context_request_projection.py +526 -0
- ksadk/harness/native/context_runtime.py +976 -0
- ksadk/harness/native/context_runtime_contracts.py +409 -0
- ksadk/harness/native/context_search.py +112 -0
- ksadk/harness/native/context_source_fragments.py +188 -0
- ksadk/harness/native/context_source_progress.py +119 -0
- ksadk/harness/native/context_summary_planning.py +788 -0
- ksadk/harness/native/context_summary_recovery.py +105 -0
- ksadk/harness/native/delivery_review.py +331 -0
- ksadk/harness/native/delivery_review_contract.py +54 -0
- ksadk/harness/native/effect_admission.py +82 -0
- ksadk/harness/native/effect_control.py +318 -0
- ksadk/harness/native/effect_receipts.py +729 -0
- ksadk/harness/native/effect_runtime.py +303 -0
- ksadk/harness/native/effective_configuration.py +28 -0
- ksadk/harness/native/engine.py +945 -0
- ksadk/harness/native/final_output.py +34 -0
- ksadk/harness/native/final_submission.py +58 -0
- ksadk/harness/native/finalization_workspace.py +96 -0
- ksadk/harness/native/fork.py +151 -0
- ksadk/harness/native/guidance.py +91 -0
- ksadk/harness/native/history.py +381 -0
- ksadk/harness/native/hook_executor.py +205 -0
- ksadk/harness/native/hook_runtime_contract.py +282 -0
- ksadk/harness/native/interaction_observation.py +117 -0
- ksadk/harness/native/lease.py +103 -0
- ksadk/harness/native/machine.py +974 -0
- ksadk/harness/native/mcp_result_governance.py +156 -0
- ksadk/harness/native/model.py +570 -0
- ksadk/harness/native/model_feedback.py +63 -0
- ksadk/harness/native/model_input.py +30 -0
- ksadk/harness/native/model_recovery_contract.py +35 -0
- ksadk/harness/native/model_replay.py +128 -0
- ksadk/harness/native/model_request.py +133 -0
- ksadk/harness/native/model_runtime.py +196 -0
- ksadk/harness/native/model_takeover.py +419 -0
- ksadk/harness/native/model_tool_batch.py +40 -0
- ksadk/harness/native/observed_progress.py +46 -0
- ksadk/harness/native/operator_guidance.py +201 -0
- ksadk/harness/native/output_contract.py +80 -0
- ksadk/harness/native/output_recovery.py +24 -0
- ksadk/harness/native/ports.py +749 -0
- ksadk/harness/native/precompact_hook_runtime.py +171 -0
- ksadk/harness/native/replay_context.py +149 -0
- ksadk/harness/native/request_media.py +112 -0
- ksadk/harness/native/restore_contract.py +16 -0
- ksadk/harness/native/run_clock.py +120 -0
- ksadk/harness/native/state.py +436 -0
- ksadk/harness/native/steering.py +170 -0
- ksadk/harness/native/stop_hook_runtime.py +151 -0
- ksadk/harness/native/studio_admission.py +29 -0
- ksadk/harness/native/subagents.py +86 -0
- ksadk/harness/native/task_policy.py +99 -0
- ksadk/harness/native/task_progress.py +86 -0
- ksadk/harness/native/terminal_verification.py +43 -0
- ksadk/harness/native/tool_argument_feedback.py +178 -0
- ksadk/harness/native/tool_budget.py +253 -0
- ksadk/harness/native/tool_error_streak.py +89 -0
- ksadk/harness/native/tool_hook_runtime.py +343 -0
- ksadk/harness/native/tool_input_validation.py +58 -0
- ksadk/harness/native/tool_interruption.py +96 -0
- ksadk/harness/native/tool_observation.py +259 -0
- ksadk/harness/native/tool_progress.py +223 -0
- ksadk/harness/native/tool_recovery.py +25 -0
- ksadk/harness/native/tool_scheduling.py +33 -0
- ksadk/harness/native/tool_schema.py +126 -0
- ksadk/harness/native/transitions.py +151 -0
- ksadk/harness/native/turn_control.py +98 -0
- ksadk/harness/native/user_document.py +98 -0
- ksadk/harness/native/user_document_capture.py +49 -0
- ksadk/harness/native/user_input.py +87 -0
- ksadk/harness/native/verification.py +432 -0
- ksadk/harness/native/verification_binding.py +40 -0
- ksadk/harness/native/verification_runtime.py +233 -0
- ksadk/harness/native/verification_workspace.py +67 -0
- ksadk/harness/native_driver_failure.py +123 -0
- ksadk/harness/native_facade.py +977 -0
- ksadk/harness/native_factory.py +244 -0
- ksadk/harness/native_projection.py +503 -0
- ksadk/harness/native_runtime.py +621 -0
- ksadk/harness/native_shadow.py +250 -0
- ksadk/harness/native_shadow_inputs.py +146 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +65 -3
- ksadk/harness/public_activity.py +59 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/reasoner.py +331 -22
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +107 -2
- ksadk/harness/runtime.py +11 -2
- ksadk/harness/runtime_capabilities.py +71 -1
- ksadk/harness/sandbox_backend.py +203 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +370 -24
- ksadk/harness/skill_adapters/__init__.py +1 -0
- ksadk/harness/skill_adapters/native_bundle.py +148 -0
- ksadk/harness/skill_adapters/native_disclosure.py +306 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_runtime.py +74 -16
- ksadk/harness/spec.py +20 -10
- ksadk/harness/state.py +2 -0
- ksadk/harness/stores/__init__.py +14 -0
- ksadk/harness/stores/native_command_settlement.py +65 -0
- ksadk/harness/stores/native_contract.py +311 -0
- ksadk/harness/stores/native_memory.py +326 -0
- ksadk/harness/stores/native_memory_archive.py +70 -0
- ksadk/harness/stores/native_migration_cli.py +91 -0
- ksadk/harness/stores/native_outbox.py +56 -0
- ksadk/harness/stores/native_sqlite.py +782 -0
- ksadk/harness/stores/native_sqlite_audit.py +29 -0
- ksadk/harness/stores/native_sqlite_migration.py +252 -0
- ksadk/harness/subagent.py +12 -2
- ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
- ksadk/harness/subagent_adapters/native_background_child.py +803 -0
- ksadk/harness/subagent_adapters/native_child.py +819 -0
- ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
- ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
- ksadk/harness/subagent_adapters/native_child_result.py +392 -0
- ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
- ksadk/harness/tool_display.py +75 -0
- ksadk/harness/tool_display_contract.py +134 -0
- ksadk/harness/tool_output.py +141 -0
- ksadk/harness/tool_policy.py +3 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/workspace_adapters/__init__.py +6 -0
- ksadk/harness/workspace_adapters/native_directory.py +180 -0
- ksadk/harness/workspace_adapters/native_git.py +208 -0
- ksadk/harness/workspace_adapters/native_isolation.py +350 -0
- ksadk/interaction/providers/langgraph.py +8 -1
- ksadk/kernel/bootstrap.py +144 -160
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +25 -0
- ksadk/kernel/control.py +153 -33
- ksadk/kernel/execution_grants.py +209 -2
- ksadk/kernel/execution_grants_memory.py +127 -8
- ksadk/kernel/execution_grants_postgres.py +188 -10
- ksadk/kernel/execution_grants_sqlite.py +235 -9
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +117 -204
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/memory_store.py +38 -48
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +167 -198
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +89 -3
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +5 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +147 -216
- ksadk/kernel/store.py +47 -15
- ksadk/kernel/teams_artifact_tools.py +392 -0
- ksadk/kernel/teams_effects.py +851 -0
- ksadk/kernel/teams_execution_context.py +408 -0
- ksadk/kernel/teams_host_http.py +237 -0
- ksadk/kernel/teams_material_transport.py +245 -0
- ksadk/kernel/teams_materials.py +318 -0
- ksadk/kernel/teams_runtime_bootstrap.py +604 -0
- ksadk/kernel/teams_tool_runtime.py +273 -0
- ksadk/kernel/teams_workspace.py +259 -0
- ksadk/kernel/worker.py +323 -332
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_identity.py +27 -0
- ksadk/kernel/worker_interactions.py +197 -0
- ksadk/knowledge_base/client.py +15 -1
- ksadk/managed_runtime.py +29 -2
- ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
- ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
- ksadk/memory/adk/bounded_database_session_service.py +232 -0
- ksadk/memory/adk/resilient_session_service.py +115 -15
- ksadk/memory/adk/short_term_memory.py +8 -9
- ksadk/memory/extraction.py +120 -7
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_sqlite.py +252 -78
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/model_gateway/__init__.py +29 -0
- ksadk/model_gateway/client.py +253 -0
- ksadk/model_gateway/events.py +113 -0
- ksadk/model_gateway/matrix.py +297 -0
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/server.py +10 -7
- ksadk/model_proxy/transform.py +37 -9
- ksadk/plugins/bridges/dsh.py +18 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +380 -186
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_toolchain.py +24 -35
- ksadk/plugins/execution_host.py +8 -0
- ksadk/plugins/host.py +73 -5
- ksadk/plugins/kernel_adapter.py +44 -1
- ksadk/plugins/memory_provider.py +180 -0
- ksadk/plugins/providers/_process_group.py +50 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +1 -1
- ksadk/plugins/providers/codex.py +42 -38
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +16 -171
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +247 -34
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +91 -14
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +269 -175
- ksadk/plugins/providers/harness_tools.py +165 -36
- ksadk/plugins/providers/legacy_catalog.py +1 -1
- ksadk/plugins/providers/mcp_projection.py +100 -3
- ksadk/plugins/providers/platform_resources.py +16 -6
- ksadk/plugins/teams/application.py +3 -143
- ksadk/plugins/teams/build_artifacts.py +460 -0
- ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
- ksadk/plugins/teams/cloud_contracts.py +928 -0
- ksadk/plugins/teams/cloud_permits.py +250 -0
- ksadk/plugins/teams/domain.py +201 -148
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/postgres_store.py +299 -85
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +116 -40
- ksadk/plugins/teams/store.py +214 -6
- ksadk/plugins/teams/task_decisions.py +21 -8
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +8 -3
- ksadk/resource_runtime/skill_runtime.py +3 -0
- ksadk/resource_runtime/socket_server.py +11 -0
- ksadk/resource_runtime/worker.py +28 -4
- ksadk/runners/_adk_a2a_stream.py +122 -0
- ksadk/runners/_adk_canonical_stream.py +474 -0
- ksadk/runners/_langgraph_canonical_streams.py +527 -0
- ksadk/runners/_langgraph_runner_streams.py +6 -400
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/adk_runner.py +195 -290
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +82 -86
- ksadk/runners/utils/loader.py +28 -14
- ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
- ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +83 -128
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +4 -2
- ksadk/runtime/executor.py +97 -7
- ksadk/runtime/factory.py +13 -6
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/runner_adapter.py +123 -13
- ksadk/runtime_context.py +2 -0
- ksadk/sandbox/backends/e2b.py +30 -4
- ksadk/sandbox/backends/local_process.py +10 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +32 -2
- ksadk/sandbox/local_launcher.py +34 -0
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/routes/checkpoint_audit.py +88 -0
- ksadk/server/routes/checkpoint_listing.py +294 -0
- ksadk/server/routes/checkpoint_resolution.py +73 -20
- ksadk/server/routes/control.py +51 -3
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +17 -2
- ksadk/server/routes/misc.py +102 -12
- ksadk/server/routes/models.py +25 -1
- ksadk/server/routes/openai_compat.py +6 -0
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +6 -2
- ksadk/server/routes/sessions.py +301 -342
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +5 -2
- ksadk/server/static/assets/{ArtifactsPanel-C1YoaKhx.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-DHuAWfr5.js → CodeBlock-BVrNVtJC.js} +1 -1
- ksadk/server/static/assets/{MathMessageMarkdown-cvdrBwYr.js → MathMessageMarkdown-Dp7c4wWD.js} +1 -1
- ksadk/server/static/assets/{MermaidBlock-DeBkbJvI.js → MermaidBlock-Dxop8Rd7.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-oJj44_sV.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-Dhfv25o2.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-C35w-pn1.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-FoMY_u6D.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-zD4Rt7oE.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BCtGGkhN.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
- ksadk/server/static/assets/channel-fySsnkft.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-C2Ms13_k.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BoTj-qgx.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DOMyyjHH.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-DbJJqDli.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-CLuRCt_W.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-D0Dz847e.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-BWSRzEcd.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-CPoHqkCY.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-Bx1jS-X-.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-LzyWm4m0.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-BlW_bHED.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-Bu_S86_i.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-B7nCawed.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-W_Zow2Km.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CLIKAHON.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Dv6_QAlN.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-BWAWRDtZ.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-XA_rWMss.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-CGt_UGeO.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-C0J5_3qM.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-CIpWk_5f.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-B3bA05-e.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-DWfdmz9s.js → dist-BBsYarrI.js} +1 -1
- ksadk/server/static/assets/{dist-BLpRy_Yx.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CIRMvUM4.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-BdNFAney.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-n3n6t_FO.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DppE_r-D.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-qe8xjesy.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-2vL2sAdF.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-1nXCdsej.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-DNKuMzWc.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-t6MzE0jU.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-CPyieXEf.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-DyG6Ya-z.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/{dist-0X_j2Rcc.js → dist-bupkyEBZ.js} +1 -1
- ksadk/server/static/assets/{dist-mqD5TZup.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-M-SrdhhZ.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-D-92S-Fd.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-BO_UwatH.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-BfCzF1Xi.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-Dpz9_0zn.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DDaG1f4_.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DcxzRwYC.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
- ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
- ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CYMdn6lQ.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CLHFAD6c.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-BHSKQGAl.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-D5W3tjTT.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-mtjOi4KM.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-BETqsxE_.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DPWrvs90.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-CJG2mfBP.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-GjAPNaqn.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-ToIewrqr.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-4d78KiEY.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-DKzx4xfv.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-CJYljxQS.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-DLU2fV1w.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CVqysrA9.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-BUxfmTHc.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-CNFgYI9E.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-B6qCMe8N.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-CMD3x_U_.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BqtUqvXM.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-B5KfDjI-.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BaUlSZrn.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +8 -1
- ksadk/sessions/_checkpoint_resume_audit.py +44 -0
- ksadk/sessions/_in_memory_query.py +112 -0
- ksadk/sessions/_local_service_sync.py +157 -156
- ksadk/sessions/_local_state_sync.py +152 -0
- ksadk/sessions/_local_tables.py +2 -0
- ksadk/sessions/_postgres_checkpoint_read.py +323 -0
- ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
- ksadk/sessions/_postgres_history_read.py +678 -0
- ksadk/sessions/_postgres_schema.py +44 -2
- ksadk/sessions/_postgres_tables.py +2 -0
- ksadk/sessions/_postgres_tool_receipts.py +169 -0
- ksadk/sessions/_resilient_read.py +630 -0
- ksadk/sessions/_tool_receipt_sync.py +119 -0
- ksadk/sessions/agent_identity.py +16 -0
- ksadk/sessions/base.py +278 -0
- ksadk/sessions/db_budget.py +332 -0
- ksadk/sessions/errors.py +12 -0
- ksadk/sessions/history_budget.py +36 -0
- ksadk/sessions/history_identity.py +27 -0
- ksadk/sessions/in_memory.py +376 -113
- ksadk/sessions/local_service.py +345 -0
- ksadk/sessions/postgres_service.py +515 -549
- ksadk/sessions/resilience.py +21 -14
- ksadk/sessions/resilient.py +611 -504
- ksadk/skills/loader.py +44 -2
- ksadk/skills/runtime/backends/e2b.py +17 -14
- ksadk/skills/service_client.py +6 -1
- ksadk/studio/a2a_bindings.py +407 -0
- ksadk/studio/a2a_orchestration.py +178 -0
- ksadk/studio/active_run_output.py +92 -0
- ksadk/studio/activity_records.py +542 -0
- ksadk/studio/agent_configuration.py +173 -0
- ksadk/studio/api.py +219 -389
- ksadk/studio/api_a2a_routes.py +93 -0
- ksadk/studio/api_catalog_routes.py +13 -0
- ksadk/studio/api_cloud_chat_routes.py +382 -0
- ksadk/studio/api_contracts.py +23 -0
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +20 -2
- ksadk/studio/capabilities.py +8 -3
- ksadk/studio/cloud.py +83 -377
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +7 -0
- ksadk/studio/codex_agent_service.py +17 -0
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/compiler.py +102 -6
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +231 -201
- ksadk/studio/dsh_application.py +58 -12
- ksadk/studio/dsh_capability_service.py +17 -171
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/event_store.py +17 -0
- ksadk/studio/execution_host.py +84 -11
- ksadk/studio/framework_run.py +18 -0
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +12 -1
- ksadk/studio/lifecycle_status.py +43 -0
- ksadk/studio/model_buffered_wire.py +227 -0
- ksadk/studio/model_chat_tools.py +143 -0
- ksadk/studio/model_client.py +1241 -761
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +65 -31
- ksadk/studio/model_request_projection.py +284 -0
- ksadk/studio/model_responses_content.py +296 -0
- ksadk/studio/model_usage.py +109 -0
- ksadk/studio/model_wire_failure.py +110 -0
- ksadk/studio/model_wire_identity.py +138 -0
- ksadk/studio/model_wire_snapshot.py +45 -0
- ksadk/studio/model_wire_tools.py +283 -0
- ksadk/studio/native_acceptance.py +68 -0
- ksadk/studio/native_approval.py +111 -0
- ksadk/studio/native_browser_port.py +861 -0
- ksadk/studio/native_child_mcp.py +87 -0
- ksadk/studio/native_child_publication.py +68 -0
- ksadk/studio/native_child_skills.py +72 -0
- ksadk/studio/native_child_workspace.py +176 -0
- ksadk/studio/native_command_policy.py +53 -0
- ksadk/studio/native_context_port.py +326 -0
- ksadk/studio/native_context_registration.py +54 -0
- ksadk/studio/native_document_input.py +88 -0
- ksadk/studio/native_final_shape.py +852 -0
- ksadk/studio/native_gateway_stream.py +69 -0
- ksadk/studio/native_hook_port.py +145 -0
- ksadk/studio/native_hook_registration.py +70 -0
- ksadk/studio/native_inventory_disclosure.py +223 -0
- ksadk/studio/native_kernel_admission.py +84 -0
- ksadk/studio/native_language_diagnostics.py +320 -0
- ksadk/studio/native_mcp_disclosure.py +198 -0
- ksadk/studio/native_mcp_tool_port.py +219 -0
- ksadk/studio/native_memory_acceptance.py +362 -0
- ksadk/studio/native_memory_context.py +266 -0
- ksadk/studio/native_memory_flush.py +174 -0
- ksadk/studio/native_memory_sources.py +80 -0
- ksadk/studio/native_memory_tool_port.py +360 -0
- ksadk/studio/native_memory_turn.py +183 -0
- ksadk/studio/native_model_port.py +765 -0
- ksadk/studio/native_model_recovery.py +126 -0
- ksadk/studio/native_options.py +75 -0
- ksadk/studio/native_output_fields.py +58 -0
- ksadk/studio/native_planning.py +156 -0
- ksadk/studio/native_product.py +988 -0
- ksadk/studio/native_read_budget.py +426 -0
- ksadk/studio/native_recovery.py +171 -0
- ksadk/studio/native_scope.py +35 -0
- ksadk/studio/native_session_context_port.py +141 -0
- ksadk/studio/native_session_engine.py +14 -0
- ksadk/studio/native_skill_source.py +74 -0
- ksadk/studio/native_subagent_port.py +700 -0
- ksadk/studio/native_terminal_recovery.py +95 -0
- ksadk/studio/native_test_action.py +610 -0
- ksadk/studio/native_tool_port.py +477 -0
- ksadk/studio/native_user_input.py +60 -0
- ksadk/studio/native_verification_presentation.py +65 -0
- ksadk/studio/native_workspace_diagnostics.py +183 -0
- ksadk/studio/native_workspace_port.py +43 -0
- ksadk/studio/operations.py +34 -9
- ksadk/studio/plugin_composition.py +26 -10
- ksadk/studio/plugin_kernel_adapter.py +75 -1
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +639 -119
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/resource_authority.py +11 -3
- ksadk/studio/resource_catalog.py +8 -12
- ksadk/studio/run_activity.py +338 -385
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_service.py +908 -319
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +23 -4
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/service.py +356 -282
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +393 -169
- ksadk/studio/shared_web_response_events.py +180 -0
- ksadk/studio/shared_web_run_state.py +133 -0
- ksadk/studio/skill_discovery.py +305 -3
- ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
- ksadk/studio/static/assets/{CodeBlock-DMIf4h33-UIqo-BPW.js → CodeBlock-DMIf4h33-CkufcPYo.js} +3 -3
- ksadk/studio/static/assets/{MathMessageMarkdown-BesSeCYl-OhNwH4K9.js → MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js} +1 -1
- ksadk/studio/static/assets/{MessageMarkdown-CwMTvgFj-g0I-I4dD.js → MessageMarkdown-CwMTvgFj-BeyLyQHu.js} +2 -2
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/index.html +3 -3
- ksadk/studio/teams_catalog.py +33 -0
- ksadk/studio/teams_installation.py +4 -1
- ksadk/studio/teams_node.py +4 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +3 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +259 -37
- ksadk/studio/templates.py +1 -0
- ksadk/studio/workspace_plugins.py +3 -1
- ksadk/tools/a2a_policy.py +5 -0
- ksadk/tools/artifact_observation.py +53 -0
- ksadk/tools/captured_source_artifact.py +68 -0
- ksadk/tools/schema.py +34 -0
- ksadk/toolsets/__init__.py +82 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +342 -324
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_model_observation.py +104 -0
- ksadk/toolsets/workspace_mutation.py +75 -0
- ksadk/toolsets/workspace_read_budget.py +216 -0
- ksadk/toolsets/workspace_search.py +192 -0
- ksadk/toolsets/workspace_search_process.py +129 -0
- ksadk/toolsets/workspace_state.py +6 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/http_headers.py +18 -0
- ksadk_runtime_common/workspace_files/router.py +2 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +0 -1
- ksadk/server/static/assets/channel-_KDifNys.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +0 -1
- ksadk/server/static/assets/index-BMd2mucF.css +0 -2
- ksadk/server/static/assets/index-D5qyyhTH.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +0 -1
- ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +0 -8
- ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +0 -3
- ksadk/studio/static/assets/index-CfEnms6Y.css +0 -2
- ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
ksadk/plugins/builtins.py
CHANGED
|
@@ -9,24 +9,74 @@ contract; it does not introduce another event or transcript pipeline.
|
|
|
9
9
|
|
|
10
10
|
from __future__ import annotations
|
|
11
11
|
|
|
12
|
+
import asyncio
|
|
12
13
|
import hashlib
|
|
13
14
|
import json
|
|
15
|
+
import threading
|
|
14
16
|
from collections.abc import Callable, Mapping, Sequence
|
|
15
|
-
from pathlib import Path
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from pathlib import PurePosixPath as PurePosixPath
|
|
16
19
|
from typing import Any, cast
|
|
17
20
|
|
|
18
21
|
from ksadk.conversations.contracts import ConversationItem
|
|
19
22
|
from ksadk.events.session_event import SessionServiceEventStore
|
|
20
23
|
from ksadk.harness.config import McpToolSpec
|
|
24
|
+
from ksadk.plugins.builtin_resources import (
|
|
25
|
+
_bound_capability_config as _bound_capability_config,
|
|
26
|
+
)
|
|
27
|
+
from ksadk.plugins.builtin_resources import (
|
|
28
|
+
_directory_digest as _directory_digest,
|
|
29
|
+
)
|
|
30
|
+
from ksadk.plugins.builtin_resources import (
|
|
31
|
+
_directory_resource_digests as _directory_resource_digests,
|
|
32
|
+
)
|
|
33
|
+
from ksadk.plugins.builtin_resources import (
|
|
34
|
+
_is_secret_reference as _is_secret_reference,
|
|
35
|
+
)
|
|
36
|
+
from ksadk.plugins.builtin_resources import (
|
|
37
|
+
_mapping as _mapping,
|
|
38
|
+
)
|
|
39
|
+
from ksadk.plugins.builtin_resources import (
|
|
40
|
+
_match_resource as _match_resource,
|
|
41
|
+
)
|
|
42
|
+
from ksadk.plugins.builtin_resources import (
|
|
43
|
+
_optional_string as _optional_string,
|
|
44
|
+
)
|
|
45
|
+
from ksadk.plugins.builtin_resources import (
|
|
46
|
+
_required_string as _required_string,
|
|
47
|
+
)
|
|
48
|
+
from ksadk.plugins.builtin_resources import (
|
|
49
|
+
_resolved_resources as _resolved_resources,
|
|
50
|
+
)
|
|
51
|
+
from ksadk.plugins.builtin_resources import (
|
|
52
|
+
_resource_entries as _resource_entries,
|
|
53
|
+
)
|
|
54
|
+
from ksadk.plugins.builtin_resources import (
|
|
55
|
+
_safe_bundle_path as _safe_bundle_path,
|
|
56
|
+
)
|
|
57
|
+
from ksadk.plugins.builtin_resources import (
|
|
58
|
+
_string_list as _string_list,
|
|
59
|
+
)
|
|
21
60
|
from ksadk.plugins.bundle import ResolvedPluginBundle
|
|
22
61
|
from ksadk.plugins.contracts import (
|
|
23
62
|
CompositionProfile,
|
|
24
63
|
PluginManifest,
|
|
25
|
-
|
|
64
|
+
)
|
|
65
|
+
from ksadk.plugins.contracts import (
|
|
66
|
+
plugin_lock_digest as plugin_lock_digest,
|
|
26
67
|
)
|
|
27
68
|
from ksadk.plugins.host import PluginHostError
|
|
69
|
+
from ksadk.plugins.memory_provider import (
|
|
70
|
+
MemoryFlushRequest,
|
|
71
|
+
MemoryMutationRequest,
|
|
72
|
+
MemoryRecallRequest,
|
|
73
|
+
MemoryReceiptRequest,
|
|
74
|
+
MemoryRecordRequest,
|
|
75
|
+
memory_db_path,
|
|
76
|
+
memory_scope_bindings,
|
|
77
|
+
)
|
|
28
78
|
from ksadk.plugins.providers.harness import HarnessSkillContribution, HarnessTurnRequest
|
|
29
|
-
from ksadk.plugins.resolver import composition_profile_digest
|
|
79
|
+
from ksadk.plugins.resolver import composition_profile_digest as composition_profile_digest
|
|
30
80
|
from ksadk.sessions.base import BaseSessionService
|
|
31
81
|
from ksadk.sessions.local_service import LocalSessionService
|
|
32
82
|
|
|
@@ -72,7 +122,7 @@ def _manifest(
|
|
|
72
122
|
"compatibility": {
|
|
73
123
|
"kernelApi": ">=1,<2",
|
|
74
124
|
"runtimeProtocols": ["agentkit.runtime/v1"],
|
|
75
|
-
"python": ">=3.
|
|
125
|
+
"python": ">=3.12,<3.15",
|
|
76
126
|
},
|
|
77
127
|
"healthContract": "plugin.health/v1",
|
|
78
128
|
"provenance": {
|
|
@@ -124,6 +174,7 @@ def builtin_capability_manifests() -> tuple[PluginManifest, ...]:
|
|
|
124
174
|
definition="memory.provider/v1",
|
|
125
175
|
slot="memory.primary",
|
|
126
176
|
mode="unique",
|
|
177
|
+
permissions=("filesystem:memory-store",),
|
|
127
178
|
),
|
|
128
179
|
_manifest(
|
|
129
180
|
CORE_RENDERER_PLUGIN_ID,
|
|
@@ -241,6 +292,277 @@ class SQLiteSessionStoreRuntime(_BuiltinRuntime):
|
|
|
241
292
|
await service.aclose()
|
|
242
293
|
|
|
243
294
|
|
|
295
|
+
class LocalMemoryProviderRuntime(_BuiltinRuntime):
|
|
296
|
+
"""Own lazy tenant databases; the immutable Build grants each recall scope."""
|
|
297
|
+
|
|
298
|
+
def __init__(self, plugin_id: str, version: str, *, state_root: Path):
|
|
299
|
+
super().__init__(plugin_id, version)
|
|
300
|
+
self._state_root = state_root.resolve()
|
|
301
|
+
self._providers: dict[str, Any] = {}
|
|
302
|
+
self._provider_lock = threading.Lock()
|
|
303
|
+
self._pending: set[asyncio.Task] = set()
|
|
304
|
+
|
|
305
|
+
async def memory_recall(self, bundle: ResolvedPluginBundle, request: MemoryRecallRequest):
|
|
306
|
+
from ksadk.memory.models import MemorySearchResult
|
|
307
|
+
from ksadk.studio.contracts import MemorySpec
|
|
308
|
+
|
|
309
|
+
self._config(bundle)
|
|
310
|
+
request = MemoryRecallRequest.model_validate_json(request.model_dump_json())
|
|
311
|
+
policy = MemorySpec.model_validate(bundle.resolved_agent_spec.get("memory") or {})
|
|
312
|
+
if (not policy.enabled or not policy.recall.enabled or not request.max_tokens
|
|
313
|
+
or not request.query.strip() or not request.scopes):
|
|
314
|
+
return MemorySearchResult("not_configured", [], None, "local-default", 0, "exact")
|
|
315
|
+
if (request.principal.agent_id != bundle.manifest.agent_id
|
|
316
|
+
or policy.provider_ref != "local-default"
|
|
317
|
+
or set(request.scopes) - set(policy.scopes)
|
|
318
|
+
or request.top_k > policy.recall.top_k
|
|
319
|
+
or request.max_tokens > policy.recall.max_tokens
|
|
320
|
+
or request.min_score != policy.recall.min_score):
|
|
321
|
+
raise PluginHostError("memory_recall_unbound", "Memory recall exceeds its Build grant")
|
|
322
|
+
return await self._owned(self._recall, request)
|
|
323
|
+
|
|
324
|
+
async def memory_search(self, bundle: ResolvedPluginBundle, request: MemoryRecallRequest):
|
|
325
|
+
"""A model-directed read retains Build bounds without automatic injection."""
|
|
326
|
+
request = MemoryRecallRequest.model_validate_json(request.model_dump_json())
|
|
327
|
+
policy = self._memory_policy(bundle, request.principal)
|
|
328
|
+
if (set(request.scopes) - set(policy.scopes)
|
|
329
|
+
or request.top_k > policy.recall.top_k
|
|
330
|
+
or request.max_tokens > policy.recall.max_tokens
|
|
331
|
+
or request.min_score != policy.recall.min_score):
|
|
332
|
+
raise PluginHostError("memory_search_unbound", "Memory search exceeds its Build grant")
|
|
333
|
+
if not request.query.strip():
|
|
334
|
+
raise PluginHostError("memory_search_query_missing", "Memory search requires a query")
|
|
335
|
+
if not request.max_tokens or not request.scopes:
|
|
336
|
+
from ksadk.memory.models import MemorySearchResult
|
|
337
|
+
|
|
338
|
+
return MemorySearchResult("not_configured", [], None, "local-default", 0, "exact")
|
|
339
|
+
return await self._owned(self._recall, request)
|
|
340
|
+
|
|
341
|
+
async def _owned(self, callback, request):
|
|
342
|
+
task = asyncio.create_task(asyncio.to_thread(callback, request))
|
|
343
|
+
self._pending.add(task)
|
|
344
|
+
task.add_done_callback(self._drain_read)
|
|
345
|
+
# Cancellation cannot detach a database operation from its owner.
|
|
346
|
+
return await asyncio.shield(task)
|
|
347
|
+
|
|
348
|
+
def _drain_read(self, task):
|
|
349
|
+
self._pending.discard(task)
|
|
350
|
+
if not task.cancelled():
|
|
351
|
+
task.exception()
|
|
352
|
+
|
|
353
|
+
def _provider(self, principal):
|
|
354
|
+
from ksadk.memory.providers.local_sqlite import SqliteMemoryProvider
|
|
355
|
+
|
|
356
|
+
with self._provider_lock:
|
|
357
|
+
self._require_ready()
|
|
358
|
+
tenant = principal.tenant_id
|
|
359
|
+
if tenant not in self._providers:
|
|
360
|
+
self._providers[tenant] = SqliteMemoryProvider(
|
|
361
|
+
db_path=memory_db_path(self._state_root, principal),
|
|
362
|
+
tenant_id=tenant, workspace_id=principal.workspace_id,
|
|
363
|
+
)
|
|
364
|
+
return self._providers[tenant]
|
|
365
|
+
|
|
366
|
+
def _recall(self, request):
|
|
367
|
+
from dataclasses import replace
|
|
368
|
+
|
|
369
|
+
from ksadk.memory.models import MemorySearchRequest
|
|
370
|
+
|
|
371
|
+
provider = self._provider(request.principal)
|
|
372
|
+
result = provider.search(MemorySearchRequest(
|
|
373
|
+
query=request.query,
|
|
374
|
+
scopes=list(memory_scope_bindings(request.principal, request.scopes)),
|
|
375
|
+
memory_types=["profile", "fact", "episode"], top_k=request.top_k,
|
|
376
|
+
max_tokens=request.max_tokens, min_score=request.min_score,
|
|
377
|
+
filters={"keyword_relevance": True, "defer_token_budget": True,
|
|
378
|
+
"tenant_id": request.principal.tenant_id},
|
|
379
|
+
))
|
|
380
|
+
return replace(result, provider="local-default",
|
|
381
|
+
retrieval_strategy="keyword")
|
|
382
|
+
|
|
383
|
+
def _memory_policy(self, bundle, principal):
|
|
384
|
+
from ksadk.studio.contracts import MemorySpec
|
|
385
|
+
|
|
386
|
+
self._config(bundle)
|
|
387
|
+
policy = MemorySpec.model_validate(bundle.resolved_agent_spec.get("memory") or {})
|
|
388
|
+
if (not policy.enabled or policy.provider_ref != "local-default"
|
|
389
|
+
or principal.agent_id != bundle.manifest.agent_id):
|
|
390
|
+
raise PluginHostError("memory_unbound", "Memory is outside its Build grant")
|
|
391
|
+
return policy
|
|
392
|
+
|
|
393
|
+
async def memory_read(self, bundle, request: MemoryRecordRequest):
|
|
394
|
+
request = MemoryRecordRequest.model_validate_json(request.model_dump_json())
|
|
395
|
+
policy = self._memory_policy(bundle, request.principal)
|
|
396
|
+
if set(request.scopes) - set(policy.scopes):
|
|
397
|
+
raise PluginHostError("memory_unbound", "Memory is outside its Build scopes")
|
|
398
|
+
return await self._owned(self._read_record, request)
|
|
399
|
+
|
|
400
|
+
def _read_record(self, request):
|
|
401
|
+
record = self._provider(request.principal).get(request.memory_id)
|
|
402
|
+
allowed = memory_scope_bindings(request.principal, request.scopes)
|
|
403
|
+
if (record is None or record.tenant_id != request.principal.tenant_id
|
|
404
|
+
or (record.scope != "org" and record.workspace_id != request.principal.workspace_id)
|
|
405
|
+
or (record.scope, record.scope_id) not in allowed
|
|
406
|
+
or record.status != "active" or record.sensitivity == "high"):
|
|
407
|
+
return None
|
|
408
|
+
return record
|
|
409
|
+
|
|
410
|
+
async def memory_mutate(self, bundle, request: MemoryMutationRequest):
|
|
411
|
+
from ksadk.memory.models import MemoryCandidate
|
|
412
|
+
from ksadk.memory.policy import MemoryPolicy
|
|
413
|
+
from ksadk.studio.contracts import ContextSpec
|
|
414
|
+
|
|
415
|
+
request = MemoryMutationRequest.model_validate_json(request.model_dump_json())
|
|
416
|
+
policy = self._memory_policy(bundle, request.principal)
|
|
417
|
+
rollout = ContextSpec.model_validate(
|
|
418
|
+
bundle.resolved_agent_spec.get("context") or {}
|
|
419
|
+
).rollout.memory_write
|
|
420
|
+
if (policy.write.mode == "off" or rollout == "off" or request.scope not in policy.scopes
|
|
421
|
+
or (policy.write.mode == "explicit_only" and request.authority == "candidate")
|
|
422
|
+
or (request.action == "forget" and request.authority == "candidate")):
|
|
423
|
+
raise PluginHostError("memory_write_disabled", "Memory write is not granted")
|
|
424
|
+
scope, scope_id = memory_scope_bindings(request.principal, (request.scope,))[0]
|
|
425
|
+
reason = "explicit_user_request" if request.authority != "candidate" else "model_guess"
|
|
426
|
+
candidate = MemoryCandidate(
|
|
427
|
+
candidate_id=request.operation_key, operation={"remember": "add", "correct": "update",
|
|
428
|
+
"forget": "delete"}[request.action],
|
|
429
|
+
memory_type="profile", scope=scope, scope_id=scope_id, content=request.content,
|
|
430
|
+
confidence=1 if request.authority != "candidate" else 0, importance=0.8,
|
|
431
|
+
source_event_ids=[request.source_event_id], reason=reason,
|
|
432
|
+
conflicts_with=[request.memory_id] if request.memory_id else [],
|
|
433
|
+
)
|
|
434
|
+
evaluation = MemoryPolicy().evaluate(candidate)
|
|
435
|
+
if evaluation.decision != "commit":
|
|
436
|
+
return {"committed": False, "decision": evaluation.decision,
|
|
437
|
+
"code": evaluation.reason}
|
|
438
|
+
if rollout == "shadow":
|
|
439
|
+
return {"committed": False, "decision": "shadow", "action": request.action}
|
|
440
|
+
return await self._owned(self._mutate, request)
|
|
441
|
+
|
|
442
|
+
def _mutate(self, request):
|
|
443
|
+
from ksadk.memory.extraction import native_user_memory_candidate
|
|
444
|
+
from ksadk.memory.models import MemoryRecord
|
|
445
|
+
from ksadk.memory.policy import content_hash
|
|
446
|
+
|
|
447
|
+
scope, scope_id = memory_scope_bindings(request.principal, (request.scope,))[0]
|
|
448
|
+
record = MemoryRecord(
|
|
449
|
+
memory_id=request.memory_id or "", tenant_id=request.principal.tenant_id,
|
|
450
|
+
workspace_id=request.principal.workspace_id, scope=scope, scope_id=scope_id,
|
|
451
|
+
memory_type="profile", content=request.content, summary=request.content,
|
|
452
|
+
status="active", confidence=1, importance=0.8,
|
|
453
|
+
valid_from="", valid_to="", expires_at="",
|
|
454
|
+
source_session_id=request.source_session_id, source_event_ids=[request.source_event_id],
|
|
455
|
+
source_seq_range=None, content_hash=content_hash(request.content), version=1,
|
|
456
|
+
metadata={"source_goal_revision": request.source_goal_revision,
|
|
457
|
+
"source_goal_digest": request.source_goal_digest,
|
|
458
|
+
"mutation_session_id": request.source_session_id},
|
|
459
|
+
write_policy="user_confirm",
|
|
460
|
+
)
|
|
461
|
+
consumed = []
|
|
462
|
+
if request.scope == "user":
|
|
463
|
+
for source in request.source_user_observations:
|
|
464
|
+
candidate = native_user_memory_candidate(
|
|
465
|
+
source.content, source_event_id=source.source_event_id,
|
|
466
|
+
scope=scope, scope_id=scope_id,
|
|
467
|
+
)
|
|
468
|
+
if candidate is not None:
|
|
469
|
+
consumed.append((candidate, source.source_digest))
|
|
470
|
+
return self._provider(request.principal).apply_mutation(
|
|
471
|
+
record, action=request.action, expected_version=request.expected_version,
|
|
472
|
+
operation_key=request.operation_key, request_digest=request.request_digest,
|
|
473
|
+
consumed_user_candidates=tuple(consumed),
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
async def memory_receipt(self, bundle, request: MemoryReceiptRequest):
|
|
477
|
+
request = MemoryReceiptRequest.model_validate_json(request.model_dump_json())
|
|
478
|
+
self._memory_policy(bundle, request.principal)
|
|
479
|
+
return await self._owned(self._receipt, request)
|
|
480
|
+
|
|
481
|
+
async def memory_flush(self, bundle, request: MemoryFlushRequest):
|
|
482
|
+
"""Evaluate actual user observations under the locked Native write policy."""
|
|
483
|
+
from ksadk.memory.extraction import native_user_memory_candidate
|
|
484
|
+
from ksadk.memory.policy import MemoryPolicy
|
|
485
|
+
from ksadk.studio.contracts import ContextSpec
|
|
486
|
+
|
|
487
|
+
request = MemoryFlushRequest.model_validate_json(request.model_dump_json())
|
|
488
|
+
policy = self._memory_policy(bundle, request.principal)
|
|
489
|
+
rollout = ContextSpec.model_validate(
|
|
490
|
+
bundle.resolved_agent_spec.get("context") or {},
|
|
491
|
+
).rollout.memory_write
|
|
492
|
+
if (policy.write.mode == "off" or rollout == "off" or "user" not in policy.scopes
|
|
493
|
+
or request.trigger == "pre_compaction"
|
|
494
|
+
and not policy.write.flush_before_compaction
|
|
495
|
+
or request.trigger == "completed_turn" and not policy.write.flush_after_turn):
|
|
496
|
+
return {"status": "disabled", "proposed": 0, "committed": 0, "results": []}
|
|
497
|
+
scope, scope_id = memory_scope_bindings(request.principal, ("user",))[0]
|
|
498
|
+
candidates = []
|
|
499
|
+
for observation in request.observations:
|
|
500
|
+
candidate = native_user_memory_candidate(
|
|
501
|
+
observation.content, source_event_id=observation.source_event_id,
|
|
502
|
+
scope=scope, scope_id=scope_id,
|
|
503
|
+
)
|
|
504
|
+
if candidate is not None and (
|
|
505
|
+
policy.write.mode != "explicit_only" or candidate.reason.startswith("explicit_user")
|
|
506
|
+
):
|
|
507
|
+
candidates.append((observation, candidate))
|
|
508
|
+
if not candidates:
|
|
509
|
+
return {"status": "empty", "proposed": 0, "committed": 0, "results": []}
|
|
510
|
+
if rollout == "shadow":
|
|
511
|
+
# Shadow decisions live in the caller's effect receipt, not in a
|
|
512
|
+
# Provider database, pending-observation counter or durable fact.
|
|
513
|
+
return {"status": "shadow", "proposed": len(candidates), "committed": 0,
|
|
514
|
+
"results": [{"decision": MemoryPolicy().evaluate(item).decision}
|
|
515
|
+
for _source, item in candidates]}
|
|
516
|
+
return await self._owned(self._flush, (request, policy, candidates))
|
|
517
|
+
|
|
518
|
+
def _flush(self, data):
|
|
519
|
+
from ksadk.memory.extraction import NATIVE_USER_EXTRACTION_POLICY
|
|
520
|
+
|
|
521
|
+
request, policy, candidates = data
|
|
522
|
+
provider = self._provider(request.principal)
|
|
523
|
+
results = []
|
|
524
|
+
for observation, candidate in candidates:
|
|
525
|
+
identity = {"principal": request.principal.model_dump(mode="json"),
|
|
526
|
+
"source_event_id": observation.source_event_id,
|
|
527
|
+
"policy": NATIVE_USER_EXTRACTION_POLICY,
|
|
528
|
+
"memory": policy.model_dump(mode="json")}
|
|
529
|
+
# The original source identity is stable across compaction/Turn
|
|
530
|
+
# consumers under the same grant. Changed grants need a distinct
|
|
531
|
+
# evaluation receipt; the original source marker still prevents
|
|
532
|
+
# counting that evaluation as another user observation.
|
|
533
|
+
key = "native-memory-candidate:" + hashlib.sha256(
|
|
534
|
+
json.dumps(identity, sort_keys=True, ensure_ascii=False).encode(),
|
|
535
|
+
).hexdigest()
|
|
536
|
+
payload = {**identity, "source": observation.model_dump(mode="json")}
|
|
537
|
+
request_digest = "sha256:" + hashlib.sha256(
|
|
538
|
+
json.dumps(payload, sort_keys=True, ensure_ascii=False).encode(),
|
|
539
|
+
).hexdigest()
|
|
540
|
+
results.append(provider.apply_candidate(
|
|
541
|
+
candidate, operation_key=key, request_digest=request_digest,
|
|
542
|
+
source_session_id=observation.source_session_id,
|
|
543
|
+
source_digest=observation.source_digest,
|
|
544
|
+
tenant_id=request.principal.tenant_id,
|
|
545
|
+
workspace_id=request.principal.workspace_id,
|
|
546
|
+
))
|
|
547
|
+
return {"status": "evaluated", "proposed": len(candidates),
|
|
548
|
+
"committed": sum(item["committed"] for item in results), "results": results}
|
|
549
|
+
|
|
550
|
+
def _receipt(self, request):
|
|
551
|
+
return self._provider(request.principal).mutation_receipt(
|
|
552
|
+
request.operation_key, request.request_digest
|
|
553
|
+
)
|
|
554
|
+
|
|
555
|
+
async def dispose(self):
|
|
556
|
+
self._ready = False
|
|
557
|
+
self._disposed = True
|
|
558
|
+
if self._pending:
|
|
559
|
+
await asyncio.gather(*tuple(self._pending), return_exceptions=True)
|
|
560
|
+
with self._provider_lock:
|
|
561
|
+
for provider in self._providers.values():
|
|
562
|
+
provider.close()
|
|
563
|
+
self._providers.clear()
|
|
564
|
+
|
|
565
|
+
|
|
244
566
|
class WorkspaceMCPRuntime(_BuiltinRuntime):
|
|
245
567
|
"""Materialize locked workspace MCP resources for the Harness provider."""
|
|
246
568
|
|
|
@@ -334,6 +656,9 @@ class WorkspaceMCPRuntime(_BuiltinRuntime):
|
|
|
334
656
|
api_key=api_key,
|
|
335
657
|
tool_filter=tuple(_string_list(materializer.get("toolFilter"))),
|
|
336
658
|
tool_name_prefix=_optional_string(materializer.get("toolNamePrefix")),
|
|
659
|
+
# McpToolSpec.description 声明为 str:无静态描述时给 "",
|
|
660
|
+
# 不要传 None(下游按 str 消费)。
|
|
661
|
+
description=_optional_string(materializer.get("description")) or "",
|
|
337
662
|
)
|
|
338
663
|
)
|
|
339
664
|
return tuple(specs)
|
|
@@ -356,7 +681,9 @@ class WorkspaceMCPRuntime(_BuiltinRuntime):
|
|
|
356
681
|
class WorkspaceSkillRuntime(_BuiltinRuntime):
|
|
357
682
|
"""Expose integrity-checked Skill instructions copied into the Bundle."""
|
|
358
683
|
|
|
359
|
-
def
|
|
684
|
+
def harness_skills(
|
|
685
|
+
self, bundle: ResolvedPluginBundle
|
|
686
|
+
) -> tuple[HarnessSkillContribution, ...]:
|
|
360
687
|
config = self._config(bundle)
|
|
361
688
|
declared = _resource_entries(config, expected_kind="skill")
|
|
362
689
|
resolved = _resolved_resources(bundle, "skills")
|
|
@@ -381,6 +708,7 @@ class WorkspaceSkillRuntime(_BuiltinRuntime):
|
|
|
381
708
|
"builtin_skill_digest_mismatch",
|
|
382
709
|
f"Skill {name!r} does not match its locked Bundle digest",
|
|
383
710
|
)
|
|
711
|
+
source_ref = _required_string(entry, "resourceId", code="builtin_skill_invalid")
|
|
384
712
|
instructions = _required_string(
|
|
385
713
|
item, "instructions", code="builtin_skill_instructions_missing"
|
|
386
714
|
)
|
|
@@ -389,12 +717,23 @@ class WorkspaceSkillRuntime(_BuiltinRuntime):
|
|
|
389
717
|
name=name,
|
|
390
718
|
instructions=instructions,
|
|
391
719
|
resource_root=directory,
|
|
720
|
+
source_ref=source_ref,
|
|
721
|
+
content_digest=expected_digest,
|
|
392
722
|
)
|
|
393
723
|
)
|
|
394
724
|
if not contributions:
|
|
395
725
|
raise PluginHostError(
|
|
396
726
|
"builtin_skill_resource_missing", "workspace Skill has no locked resource"
|
|
397
727
|
)
|
|
728
|
+
if len({item.source_ref for item in contributions}) != len(contributions):
|
|
729
|
+
raise PluginHostError(
|
|
730
|
+
"builtin_skill_invalid", "workspace Skills must have unique locked resource IDs"
|
|
731
|
+
)
|
|
732
|
+
return tuple(contributions)
|
|
733
|
+
|
|
734
|
+
def harness_skill(self, bundle: ResolvedPluginBundle) -> HarnessSkillContribution:
|
|
735
|
+
"""Retain the singular ABI for existing providers and direct consumers."""
|
|
736
|
+
contributions = self.harness_skills(bundle)
|
|
398
737
|
if len(contributions) == 1:
|
|
399
738
|
return contributions[0]
|
|
400
739
|
return HarnessSkillContribution(
|
|
@@ -433,9 +772,30 @@ class ReadOnlyBundleContextRuntime(_BuiltinRuntime):
|
|
|
433
772
|
"builtin_context_path_invalid",
|
|
434
773
|
f"Bundle context path is not a regular file: {relative}",
|
|
435
774
|
)
|
|
775
|
+
# Resolution verifies the Bundle once; an activation can outlive
|
|
776
|
+
# changes on disk. Authorize and project the same byte snapshot,
|
|
777
|
+
# before truncating it to the configured character budget.
|
|
778
|
+
entry_path = PurePosixPath(relative).as_posix()
|
|
779
|
+
entries = [item for item in bundle.manifest.files if item.path == entry_path]
|
|
780
|
+
try:
|
|
781
|
+
content = path.read_bytes()
|
|
782
|
+
except OSError as error:
|
|
783
|
+
raise PluginHostError(
|
|
784
|
+
"builtin_context_read_failed",
|
|
785
|
+
f"Bundle context file could not be read: {relative}",
|
|
786
|
+
) from error
|
|
787
|
+
if (
|
|
788
|
+
len(entries) != 1
|
|
789
|
+
or len(content) != entries[0].size
|
|
790
|
+
or "sha256:" + hashlib.sha256(content).hexdigest() != entries[0].sha256
|
|
791
|
+
):
|
|
792
|
+
raise PluginHostError(
|
|
793
|
+
"builtin_context_source_integrity",
|
|
794
|
+
f"Bundle context file no longer matches its locked bytes: {relative}",
|
|
795
|
+
)
|
|
436
796
|
try:
|
|
437
|
-
text =
|
|
438
|
-
except
|
|
797
|
+
text = content.decode("utf-8").strip()
|
|
798
|
+
except UnicodeError as error:
|
|
439
799
|
raise PluginHostError(
|
|
440
800
|
"builtin_context_read_failed",
|
|
441
801
|
f"Bundle context file could not be read: {relative}",
|
|
@@ -516,6 +876,18 @@ class SQLiteSessionStoreFactory:
|
|
|
516
876
|
return runtime
|
|
517
877
|
|
|
518
878
|
|
|
879
|
+
class LocalMemoryProviderFactory:
|
|
880
|
+
def __init__(self, state_root: Path):
|
|
881
|
+
self._state_root = state_root.resolve()
|
|
882
|
+
|
|
883
|
+
async def stage(self, manifest, *, profile, services):
|
|
884
|
+
del profile, services
|
|
885
|
+
_require_manifest(manifest, LOCAL_MEMORY_PROVIDER_PLUGIN_ID)
|
|
886
|
+
return LocalMemoryProviderRuntime(
|
|
887
|
+
manifest.metadata.id, manifest.metadata.version, state_root=self._state_root,
|
|
888
|
+
)
|
|
889
|
+
|
|
890
|
+
|
|
519
891
|
class _WorkspaceMCPFactory:
|
|
520
892
|
def __init__(self, secret_resolver: SecretResolver | None) -> None:
|
|
521
893
|
self._secret_resolver = secret_resolver
|
|
@@ -571,9 +943,7 @@ def builtin_capability_factories(
|
|
|
571
943
|
READ_ONLY_CONTEXT_PLUGIN_ID: _SimpleFactory(
|
|
572
944
|
READ_ONLY_CONTEXT_PLUGIN_ID, ReadOnlyBundleContextRuntime
|
|
573
945
|
),
|
|
574
|
-
LOCAL_MEMORY_PROVIDER_PLUGIN_ID:
|
|
575
|
-
LOCAL_MEMORY_PROVIDER_PLUGIN_ID, _BuiltinRuntime
|
|
576
|
-
),
|
|
946
|
+
LOCAL_MEMORY_PROVIDER_PLUGIN_ID: LocalMemoryProviderFactory(state_root),
|
|
577
947
|
CORE_RENDERER_PLUGIN_ID: _SimpleFactory(
|
|
578
948
|
CORE_RENDERER_PLUGIN_ID, CoreConversationRendererRuntime
|
|
579
949
|
),
|
|
@@ -588,182 +958,6 @@ def _require_manifest(manifest: PluginManifest, plugin_id: str) -> None:
|
|
|
588
958
|
)
|
|
589
959
|
|
|
590
960
|
|
|
591
|
-
def _bound_capability_config(
|
|
592
|
-
bundle: ResolvedPluginBundle, plugin_id: str, version: str
|
|
593
|
-
) -> Mapping[str, Any]:
|
|
594
|
-
composition = bundle.composition
|
|
595
|
-
if composition_profile_digest(composition.profile) != composition.profile_digest:
|
|
596
|
-
raise PluginHostError(
|
|
597
|
-
"plugin_bundle_profile_mutated",
|
|
598
|
-
"resolved Bundle composition profile changed after validation",
|
|
599
|
-
)
|
|
600
|
-
if plugin_lock_digest(composition.plugin_lock) != composition.plugin_lock_digest:
|
|
601
|
-
raise PluginHostError(
|
|
602
|
-
"plugin_bundle_lock_mutated",
|
|
603
|
-
"resolved Bundle plugin lock changed after validation",
|
|
604
|
-
)
|
|
605
|
-
ref = f"plugin://{plugin_id}@{version}"
|
|
606
|
-
matches = [item for item in composition.profile.capabilities if item.ref == ref]
|
|
607
|
-
if len(matches) != 1:
|
|
608
|
-
raise PluginHostError(
|
|
609
|
-
"builtin_capability_binding_missing",
|
|
610
|
-
f"resolved Bundle does not bind built-in capability {plugin_id}@{version}",
|
|
611
|
-
)
|
|
612
|
-
if not any(
|
|
613
|
-
item.id == plugin_id and item.version == version for item in composition.plugin_lock.plugins
|
|
614
|
-
):
|
|
615
|
-
raise PluginHostError(
|
|
616
|
-
"builtin_capability_lock_missing",
|
|
617
|
-
f"resolved Bundle does not lock built-in capability {plugin_id}@{version}",
|
|
618
|
-
)
|
|
619
|
-
return cast(Mapping[str, Any], matches[0].config)
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
def _resource_entries(
|
|
623
|
-
config: Mapping[str, Any], *, expected_kind: str
|
|
624
|
-
) -> tuple[Mapping[str, Any], ...]:
|
|
625
|
-
raw = config.get("resources")
|
|
626
|
-
if not isinstance(raw, Sequence) or isinstance(raw, (str, bytes)):
|
|
627
|
-
raise PluginHostError(
|
|
628
|
-
f"builtin_{expected_kind}_config_invalid", "resources must be an array"
|
|
629
|
-
)
|
|
630
|
-
entries: list[Mapping[str, Any]] = []
|
|
631
|
-
for item in raw:
|
|
632
|
-
entry = _mapping(item, code=f"builtin_{expected_kind}_config_invalid")
|
|
633
|
-
if entry.get("kind") != expected_kind:
|
|
634
|
-
raise PluginHostError(
|
|
635
|
-
f"builtin_{expected_kind}_resource_mismatch",
|
|
636
|
-
f"resource kind must be {expected_kind!r}",
|
|
637
|
-
)
|
|
638
|
-
for field in ("resourceId", "name", "version", "digest"):
|
|
639
|
-
_required_string(entry, field, code=f"builtin_{expected_kind}_invalid")
|
|
640
|
-
entries.append(entry)
|
|
641
|
-
return tuple(entries)
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
def _resolved_resources(bundle: ResolvedPluginBundle, field: str) -> tuple[Mapping[str, Any], ...]:
|
|
645
|
-
capabilities = _mapping(
|
|
646
|
-
bundle.resolved_agent_spec.get("capabilities"),
|
|
647
|
-
code="builtin_bundle_capabilities_missing",
|
|
648
|
-
)
|
|
649
|
-
raw = capabilities.get(field)
|
|
650
|
-
if not isinstance(raw, Sequence) or isinstance(raw, (str, bytes)):
|
|
651
|
-
raise PluginHostError(
|
|
652
|
-
"builtin_bundle_capabilities_missing", f"Bundle capabilities.{field} is missing"
|
|
653
|
-
)
|
|
654
|
-
return tuple(_mapping(item, code="builtin_bundle_capabilities_invalid") for item in raw)
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
def _match_resource(
|
|
658
|
-
declared: Mapping[str, Any],
|
|
659
|
-
resolved: Sequence[Mapping[str, Any]],
|
|
660
|
-
*,
|
|
661
|
-
code: str,
|
|
662
|
-
) -> Mapping[str, Any]:
|
|
663
|
-
name = _required_string(declared, "name", code=code)
|
|
664
|
-
version = _required_string(declared, "version", code=code)
|
|
665
|
-
digest = _required_string(declared, "digest", code=code)
|
|
666
|
-
matches = [
|
|
667
|
-
item
|
|
668
|
-
for item in resolved
|
|
669
|
-
if item.get("name") == name
|
|
670
|
-
and item.get("version") == version
|
|
671
|
-
and item.get("digest") == digest
|
|
672
|
-
]
|
|
673
|
-
if len(matches) != 1:
|
|
674
|
-
raise PluginHostError(
|
|
675
|
-
code,
|
|
676
|
-
f"locked resource {name!r}@{version} is missing from resolved Agent spec",
|
|
677
|
-
)
|
|
678
|
-
return matches[0]
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
def _safe_bundle_path(
|
|
682
|
-
bundle: ResolvedPluginBundle,
|
|
683
|
-
relative_text: str,
|
|
684
|
-
*,
|
|
685
|
-
code: str,
|
|
686
|
-
require_declared: bool,
|
|
687
|
-
) -> Path:
|
|
688
|
-
relative = PurePosixPath(relative_text)
|
|
689
|
-
if relative.is_absolute() or not relative.parts or ".." in relative.parts:
|
|
690
|
-
raise PluginHostError(code, f"unsafe Bundle path: {relative_text}")
|
|
691
|
-
path = bundle.root.joinpath(*relative.parts)
|
|
692
|
-
cursor = bundle.root
|
|
693
|
-
for part in relative.parts:
|
|
694
|
-
cursor = cursor / part
|
|
695
|
-
if cursor.is_symlink():
|
|
696
|
-
raise PluginHostError(code, f"Bundle path cannot use symlinks: {relative_text}")
|
|
697
|
-
try:
|
|
698
|
-
resolved = path.resolve(strict=True)
|
|
699
|
-
resolved.relative_to(bundle.root)
|
|
700
|
-
except (OSError, ValueError) as error:
|
|
701
|
-
raise PluginHostError(code, f"Bundle path is unavailable: {relative_text}") from error
|
|
702
|
-
if require_declared and relative.as_posix() not in {
|
|
703
|
-
item.path for item in bundle.manifest.files
|
|
704
|
-
}:
|
|
705
|
-
raise PluginHostError(code, f"Bundle path is not declared: {relative_text}")
|
|
706
|
-
return cast(Path, resolved)
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
def _directory_digest(directory: Path) -> str:
|
|
710
|
-
digest = hashlib.sha256()
|
|
711
|
-
for path in sorted(item for item in directory.rglob("*") if item.is_file()):
|
|
712
|
-
if path.is_symlink():
|
|
713
|
-
raise PluginHostError(
|
|
714
|
-
"builtin_skill_path_invalid", "Skill Bundle cannot contain symlinks"
|
|
715
|
-
)
|
|
716
|
-
relative = path.relative_to(directory).as_posix().encode("utf-8")
|
|
717
|
-
content = path.read_bytes()
|
|
718
|
-
digest.update(len(relative).to_bytes(4, "big"))
|
|
719
|
-
digest.update(relative)
|
|
720
|
-
digest.update(len(content).to_bytes(8, "big"))
|
|
721
|
-
digest.update(content)
|
|
722
|
-
return f"sha256:{digest.hexdigest()}"
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
def _mapping(value: Any, *, code: str) -> Mapping[str, Any]:
|
|
726
|
-
if not isinstance(value, Mapping):
|
|
727
|
-
raise PluginHostError(code, "expected an object")
|
|
728
|
-
return value
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
def _required_string(value: Mapping[str, Any], field: str, *, code: str) -> str:
|
|
732
|
-
text = value.get(field)
|
|
733
|
-
if not isinstance(text, str) or not text.strip():
|
|
734
|
-
raise PluginHostError(code, f"{field} must be a non-empty string")
|
|
735
|
-
return text.strip()
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
def _optional_string(value: Any) -> str | None:
|
|
739
|
-
if value is None:
|
|
740
|
-
return None
|
|
741
|
-
if not isinstance(value, str):
|
|
742
|
-
raise PluginHostError(
|
|
743
|
-
"builtin_config_invalid", "optional configuration value must be a string"
|
|
744
|
-
)
|
|
745
|
-
return value.strip() or None
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
def _string_list(value: Any) -> tuple[str, ...]:
|
|
749
|
-
if value is None:
|
|
750
|
-
return ()
|
|
751
|
-
if not isinstance(value, Sequence) or isinstance(value, (str, bytes)):
|
|
752
|
-
raise PluginHostError("builtin_config_invalid", "configuration value must be an array")
|
|
753
|
-
result: list[str] = []
|
|
754
|
-
for item in value:
|
|
755
|
-
if not isinstance(item, str) or not item.strip():
|
|
756
|
-
raise PluginHostError(
|
|
757
|
-
"builtin_config_invalid", "array entries must be non-empty strings"
|
|
758
|
-
)
|
|
759
|
-
result.append(item.strip())
|
|
760
|
-
return tuple(result)
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
def _is_secret_reference(value: str) -> bool:
|
|
764
|
-
return value.startswith(("secret://", "env://", "credential://", "vault://"))
|
|
765
|
-
|
|
766
|
-
|
|
767
961
|
__all__ = [
|
|
768
962
|
"BUILTIN_PLUGIN_VERSION",
|
|
769
963
|
"CORE_RENDERER_PLUGIN_ID",
|