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
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
"""Token accounting, model-visible observations and retained source working sets."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
|
|
8
|
+
from pydantic import (
|
|
9
|
+
JsonValue,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
from .context import (
|
|
13
|
+
ContextMessage,
|
|
14
|
+
)
|
|
15
|
+
from .context_artifact_page import artifact_page_observation
|
|
16
|
+
from .context_history import (
|
|
17
|
+
ContextRuntimeError,
|
|
18
|
+
_content_blocks,
|
|
19
|
+
_goal_message_index,
|
|
20
|
+
_historical_message,
|
|
21
|
+
_json,
|
|
22
|
+
_unambiguous_json_object,
|
|
23
|
+
text_only_tool_message,
|
|
24
|
+
)
|
|
25
|
+
from .context_microcompact import project_old_tool_results
|
|
26
|
+
from .context_pruning import (
|
|
27
|
+
project_fresh_workspace_reads,
|
|
28
|
+
)
|
|
29
|
+
from .context_runtime_contracts import (
|
|
30
|
+
Messages,
|
|
31
|
+
PreparedContext,
|
|
32
|
+
ToolResultPruning,
|
|
33
|
+
_model_continuity,
|
|
34
|
+
_resume,
|
|
35
|
+
_summary,
|
|
36
|
+
source_context_digest,
|
|
37
|
+
)
|
|
38
|
+
from .context_search import complete_search_observation
|
|
39
|
+
from .model import ModelProfile
|
|
40
|
+
from .ports import ToolDefinition
|
|
41
|
+
from .request_media import RequestMediaError, project_request_media
|
|
42
|
+
from .tool_observation import (
|
|
43
|
+
model_observation_message,
|
|
44
|
+
model_observation_messages,
|
|
45
|
+
)
|
|
46
|
+
from .turn_control import ModelTurnControl
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class ContextRequestProjection:
|
|
50
|
+
def _prune_old_results(self, prepared, *, refs, active, groups, mandatory, metadata,
|
|
51
|
+
continuity, history, tools, profile, fixed, turn_control):
|
|
52
|
+
protected = set(mandatory)
|
|
53
|
+
for group in self._read_working_set_groups(
|
|
54
|
+
metadata, active, groups, continuity=continuity, history=history, tools=tools,
|
|
55
|
+
):
|
|
56
|
+
protected.update(group)
|
|
57
|
+
projected, cleared_refs, cleared_calls = project_old_tool_results(
|
|
58
|
+
active, refs, groups, tools=tools, protected_refs=protected,
|
|
59
|
+
keep_recent=self.policy.prune_keep_recent_batches,
|
|
60
|
+
)
|
|
61
|
+
if not cleared_refs:
|
|
62
|
+
return None
|
|
63
|
+
from .replay_context import mark_input_edit
|
|
64
|
+
|
|
65
|
+
originals = dict(zip(refs, active))
|
|
66
|
+
projected = tuple(
|
|
67
|
+
mark_input_edit(message, originals[ref].get("content"), profile)
|
|
68
|
+
if ref in cleared_refs else message
|
|
69
|
+
for ref, message in zip(refs, projected)
|
|
70
|
+
)
|
|
71
|
+
if history.count:
|
|
72
|
+
from .context_runtime_contracts import _compacted_messages
|
|
73
|
+
|
|
74
|
+
projected = _compacted_messages(history.summary_text, projected, continuity.goal)
|
|
75
|
+
view = self._prepared(prepared.instructions, projected, fixed, turn_control,
|
|
76
|
+
profile=profile, goal=continuity.goal,
|
|
77
|
+
abandoned=history.abandoned_replay_digests,
|
|
78
|
+
replay_header_digest=prepared.replay_header_digest)
|
|
79
|
+
saved = prepared.counted_input_tokens - view.counted_input_tokens
|
|
80
|
+
if saved < self.policy.prune_min_saved_tokens:
|
|
81
|
+
return None
|
|
82
|
+
return view.model_copy(update={"tool_result_pruning": ToolResultPruning(
|
|
83
|
+
source_message_refs=cleared_refs, tool_call_ids=cleared_calls,
|
|
84
|
+
pre_input_tokens=prepared.counted_input_tokens,
|
|
85
|
+
post_input_tokens=view.counted_input_tokens, saved_tokens=saved,
|
|
86
|
+
)})
|
|
87
|
+
|
|
88
|
+
def _media_view(self, messages, profile=None, *, purpose="task"):
|
|
89
|
+
try:
|
|
90
|
+
return project_request_media(messages, profile, purpose=purpose)
|
|
91
|
+
except RequestMediaError as exc:
|
|
92
|
+
raise ContextRuntimeError(str(exc)) from None
|
|
93
|
+
|
|
94
|
+
def summary_reservation(self, profile: ModelProfile) -> int:
|
|
95
|
+
"""The actual rolling-summary text ceiling plus its two message frames."""
|
|
96
|
+
return (min(self.policy.summary_max_tokens, profile.max_output_tokens)
|
|
97
|
+
+ self._count_message(_summary("")) + self._count_message(_resume()))
|
|
98
|
+
|
|
99
|
+
def count_model_message(self, message, profile: ModelProfile) -> int:
|
|
100
|
+
"""Measure the same host projection used in admitted model requests."""
|
|
101
|
+
return self._profile_count(message, profile)
|
|
102
|
+
|
|
103
|
+
def authoritative_ledger(self, continuity, contract):
|
|
104
|
+
required = tuple(item for item in contract.items if item.required)
|
|
105
|
+
return _json({
|
|
106
|
+
"continuity": _model_continuity(continuity),
|
|
107
|
+
"required_acceptance": [item.model_dump(mode="json") for item in required],
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
def authoritative_instructions(self, instructions, continuity, contract):
|
|
111
|
+
return (instructions
|
|
112
|
+
+ "\n\nAuthoritative host execution state; historical summaries cannot change it:\n"
|
|
113
|
+
+ self.authoritative_ledger(continuity, contract))
|
|
114
|
+
|
|
115
|
+
def fixed_request_cost(self, *, instructions, continuity, contract, tools,
|
|
116
|
+
turn_control=None):
|
|
117
|
+
return self._fixed(
|
|
118
|
+
self.authoritative_instructions(instructions, continuity, contract),
|
|
119
|
+
tools, turn_control,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
def _count(self, text: str) -> int:
|
|
123
|
+
try:
|
|
124
|
+
value = self.count_tokens(text)
|
|
125
|
+
except Exception:
|
|
126
|
+
# A broken host counter cannot grant capacity or strand a Run.
|
|
127
|
+
# Match message counting; preserve cancellation/process control.
|
|
128
|
+
raise ContextRuntimeError("context_counter_invalid") from None
|
|
129
|
+
if type(value) is not int or value < 0 or (text and value == 0):
|
|
130
|
+
raise ContextRuntimeError("context_counter_invalid")
|
|
131
|
+
return value
|
|
132
|
+
|
|
133
|
+
def _fixed(
|
|
134
|
+
self,
|
|
135
|
+
instructions: str,
|
|
136
|
+
tools: tuple[ToolDefinition, ...],
|
|
137
|
+
turn_control: ModelTurnControl | None = None,
|
|
138
|
+
) -> int:
|
|
139
|
+
payload = {
|
|
140
|
+
"instructions": instructions,
|
|
141
|
+
"tools": [tool.function_schema() for tool in tools],
|
|
142
|
+
}
|
|
143
|
+
control_cost = self._count_message(turn_control.message()) if turn_control else 0
|
|
144
|
+
return self._count(_json(payload)) + self.policy.request_overhead_tokens + control_cost
|
|
145
|
+
|
|
146
|
+
def _count_message(self, message: dict[str, JsonValue]) -> int:
|
|
147
|
+
has_image = any(block["type"] == "image_url" for block in _content_blocks(message))
|
|
148
|
+
if self.count_message_tokens is None:
|
|
149
|
+
if has_image:
|
|
150
|
+
raise ContextRuntimeError("context_multimodal_counter_unavailable")
|
|
151
|
+
return self._count(_json(message))
|
|
152
|
+
try:
|
|
153
|
+
# A counter must not rewrite messages while measuring them.
|
|
154
|
+
value = self.count_message_tokens(json.loads(_json(message)))
|
|
155
|
+
except Exception:
|
|
156
|
+
raise ContextRuntimeError("context_counter_invalid") from None
|
|
157
|
+
if type(value) is not int or value <= 0:
|
|
158
|
+
raise ContextRuntimeError("context_counter_invalid")
|
|
159
|
+
return value
|
|
160
|
+
|
|
161
|
+
def _profile_count(self, message, profile=None):
|
|
162
|
+
message = model_observation_message(message)
|
|
163
|
+
replay = message.get("provider_replay")
|
|
164
|
+
bound = isinstance(replay, dict) and replay.get("input_context") is not None
|
|
165
|
+
if profile is not None and (bound or any(message.get(key) is not None for key in (
|
|
166
|
+
"provider_replay_projection", "operator_history_projection", "input_operator_history",
|
|
167
|
+
))):
|
|
168
|
+
from .model_replay import project_model_message
|
|
169
|
+
|
|
170
|
+
message = project_model_message(message, profile)
|
|
171
|
+
effective = (
|
|
172
|
+
text_only_tool_message(message)
|
|
173
|
+
if self.tool_media_projection_version is not None
|
|
174
|
+
and profile is not None
|
|
175
|
+
and profile.image_input_mode == "text_only"
|
|
176
|
+
else message
|
|
177
|
+
)
|
|
178
|
+
return self._count_message(effective)
|
|
179
|
+
|
|
180
|
+
def _prepared(
|
|
181
|
+
self,
|
|
182
|
+
instructions: str,
|
|
183
|
+
messages: Messages,
|
|
184
|
+
fixed: int,
|
|
185
|
+
turn_control: ModelTurnControl | None = None,
|
|
186
|
+
*,
|
|
187
|
+
profile: ModelProfile | None = None,
|
|
188
|
+
goal: str | None = None,
|
|
189
|
+
abandoned: tuple[str, ...] = (),
|
|
190
|
+
replay_header_digest: str | None = None,
|
|
191
|
+
) -> PreparedContext:
|
|
192
|
+
# Detach dictionaries so a ModelPort cannot mutate the authoritative transcript.
|
|
193
|
+
copied = model_observation_messages(messages)
|
|
194
|
+
from .operator_guidance import operator_input_history_view
|
|
195
|
+
|
|
196
|
+
copied = operator_input_history_view(copied, profile)
|
|
197
|
+
live = tuple(m for m in copied if m.get("kind") == "context_contribution"
|
|
198
|
+
and m.get("context_operation_key") is not None)
|
|
199
|
+
if live and goal is not None:
|
|
200
|
+
copied = tuple(m for m in copied if not (
|
|
201
|
+
m.get("kind") == "context_contribution"
|
|
202
|
+
and m.get("context_operation_key") is not None
|
|
203
|
+
))
|
|
204
|
+
index = _goal_message_index(copied, goal)
|
|
205
|
+
copied = (*copied[:index], *live, *copied[index:])
|
|
206
|
+
copied = self._media_view(copied, profile)
|
|
207
|
+
from .replay_context import project_replay_context
|
|
208
|
+
|
|
209
|
+
copied, discarded = project_replay_context(
|
|
210
|
+
copied, profile, abandoned=abandoned, header_digest=replay_header_digest,
|
|
211
|
+
)
|
|
212
|
+
return PreparedContext(
|
|
213
|
+
instructions=instructions,
|
|
214
|
+
messages=copied,
|
|
215
|
+
counted_input_tokens=fixed + sum(self._profile_count(m, profile) for m in copied),
|
|
216
|
+
tokenizer_id=self.tokenizer_id,
|
|
217
|
+
turn_control=turn_control,
|
|
218
|
+
abandoned_replay_digests=discarded,
|
|
219
|
+
replay_header_digest=replay_header_digest,
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
def _read_view(
|
|
223
|
+
self,
|
|
224
|
+
messages: Messages,
|
|
225
|
+
reader_names: frozenset[str],
|
|
226
|
+
protected_call_ids: frozenset[str] = frozenset(),
|
|
227
|
+
) -> Messages:
|
|
228
|
+
messages = model_observation_messages(messages)
|
|
229
|
+
if self.policy.fresh_read_max_chars is None or not reader_names:
|
|
230
|
+
return messages
|
|
231
|
+
return (
|
|
232
|
+
project_fresh_workspace_reads(
|
|
233
|
+
messages,
|
|
234
|
+
reader_names=reader_names,
|
|
235
|
+
max_chars=self.policy.fresh_read_max_chars,
|
|
236
|
+
protected_call_ids=protected_call_ids,
|
|
237
|
+
)
|
|
238
|
+
or messages
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
def _metadata(
|
|
242
|
+
self,
|
|
243
|
+
refs: tuple[str, ...],
|
|
244
|
+
messages: Messages,
|
|
245
|
+
*,
|
|
246
|
+
counted_messages: Messages | None = None,
|
|
247
|
+
profile: ModelProfile | None = None,
|
|
248
|
+
) -> tuple[ContextMessage, ...]:
|
|
249
|
+
counted = messages if counted_messages is None else counted_messages
|
|
250
|
+
if len(counted) != len(messages):
|
|
251
|
+
raise ContextRuntimeError("context_projection_manifest_mismatch")
|
|
252
|
+
from .operator_guidance import operator_input_history_view
|
|
253
|
+
|
|
254
|
+
counted = operator_input_history_view(counted, profile)
|
|
255
|
+
counted = self._media_view(counted, profile)
|
|
256
|
+
return tuple(
|
|
257
|
+
ContextMessage(
|
|
258
|
+
message_id=ref,
|
|
259
|
+
payload_digest=source_context_digest((message,)),
|
|
260
|
+
role=message["role"],
|
|
261
|
+
content=(
|
|
262
|
+
message["content"]
|
|
263
|
+
if isinstance(message.get("content"), str)
|
|
264
|
+
else _json(_historical_message(message)[0].get("content"))
|
|
265
|
+
),
|
|
266
|
+
# Identity and content attest to the complete transcript. The
|
|
267
|
+
# cost measures the host-derived model view, which may expose
|
|
268
|
+
# a bounded source window without rewriting that transcript.
|
|
269
|
+
token_count=self._profile_count(view, profile),
|
|
270
|
+
tool_call_ids=tuple(call["id"] for call in message.get("tool_calls", ())),
|
|
271
|
+
tool_result_for=message.get("tool_call_id"),
|
|
272
|
+
)
|
|
273
|
+
for ref, message, view in zip(refs, messages, counted)
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
def _retain(
|
|
277
|
+
self,
|
|
278
|
+
metadata,
|
|
279
|
+
groups,
|
|
280
|
+
pending_refs,
|
|
281
|
+
mandatory,
|
|
282
|
+
budget,
|
|
283
|
+
reserved_summary,
|
|
284
|
+
*,
|
|
285
|
+
active,
|
|
286
|
+
continuity,
|
|
287
|
+
history,
|
|
288
|
+
tools,
|
|
289
|
+
force_compaction=False,
|
|
290
|
+
fresh_group=frozenset(),
|
|
291
|
+
):
|
|
292
|
+
grouped = frozenset().union(*groups, pending_refs)
|
|
293
|
+
units = [
|
|
294
|
+
*groups,
|
|
295
|
+
*(frozenset((m.message_id,)) for m in metadata if m.message_id not in grouped),
|
|
296
|
+
]
|
|
297
|
+
indexes = {m.message_id: i for i, m in enumerate(metadata)}
|
|
298
|
+
costs = {m.message_id: m.token_count for m in metadata}
|
|
299
|
+
retained = set(mandatory)
|
|
300
|
+
# Preserve a bounded recent working set when it fits the post-summary
|
|
301
|
+
# target, leaving room for the next model/tool turn. A hard-window-only
|
|
302
|
+
# check can retain so much context that every turn compacts again.
|
|
303
|
+
# The complete transcript remains authoritative; historical groups
|
|
304
|
+
# outside this set are summarized. Provider-reported overflow must be
|
|
305
|
+
# allowed to reduce even these recent batches.
|
|
306
|
+
target = int(budget.input_capacity * self.policy.target_ratio) - reserved_summary
|
|
307
|
+
if force_compaction:
|
|
308
|
+
# The provider rejected our counted size: reduce the actual request,
|
|
309
|
+
# even when the pinned window estimate would normally keep it all.
|
|
310
|
+
target = min(target, sum(costs.values()) // 2 - reserved_summary)
|
|
311
|
+
if fresh_group and not force_compaction:
|
|
312
|
+
# The task has not yet responded after this complete call group.
|
|
313
|
+
# Reduce older history first, preserving its whole authorized
|
|
314
|
+
# observation above the soft target when the hard window allows.
|
|
315
|
+
proposed = retained | set(fresh_group)
|
|
316
|
+
if sum(costs[ref] for ref in proposed) <= budget.input_capacity - reserved_summary:
|
|
317
|
+
retained = proposed
|
|
318
|
+
if groups and self.policy.recent_tool_batch_count and not force_compaction:
|
|
319
|
+
protected_cost = 0
|
|
320
|
+
recent = groups[-self.policy.recent_tool_batch_count :]
|
|
321
|
+
for group in reversed(recent):
|
|
322
|
+
refs_in_group = set(group)
|
|
323
|
+
group_cost = sum(costs[ref] for ref in refs_in_group)
|
|
324
|
+
if (
|
|
325
|
+
group_cost > self.policy.recent_tool_batch_max_tokens
|
|
326
|
+
or protected_cost + group_cost
|
|
327
|
+
> self.policy.recent_tool_batches_total_max_tokens
|
|
328
|
+
):
|
|
329
|
+
break
|
|
330
|
+
combined_cost = sum(costs[ref] for ref in retained | refs_in_group)
|
|
331
|
+
if combined_cost <= target:
|
|
332
|
+
retained.update(refs_in_group)
|
|
333
|
+
protected_cost += group_cost
|
|
334
|
+
else:
|
|
335
|
+
break
|
|
336
|
+
if self.policy.read_working_set_count and not force_compaction:
|
|
337
|
+
protected_cost = 0
|
|
338
|
+
for group in self._read_working_set_groups(
|
|
339
|
+
metadata, active, groups, continuity=continuity, history=history, tools=tools
|
|
340
|
+
):
|
|
341
|
+
if protected_cost >= self.policy.read_working_set_total_max_tokens:
|
|
342
|
+
break
|
|
343
|
+
refs_in_group = set(group)
|
|
344
|
+
group_cost = sum(costs[ref] for ref in refs_in_group)
|
|
345
|
+
if (
|
|
346
|
+
group_cost > self.policy.read_working_set_max_tokens
|
|
347
|
+
or protected_cost + group_cost > self.policy.read_working_set_total_max_tokens
|
|
348
|
+
):
|
|
349
|
+
continue
|
|
350
|
+
# A complete latest source observation is working memory,
|
|
351
|
+
# rather than older history selected to fill the soft target.
|
|
352
|
+
# Removing it solely to hit that target leaves only a model
|
|
353
|
+
# summary and makes the next turn re-read already cited facts.
|
|
354
|
+
# Existing source-count/size limits and the full hard window
|
|
355
|
+
# still apply, including the reserved summary and output.
|
|
356
|
+
ceiling = (
|
|
357
|
+
budget.input_capacity - reserved_summary if group == groups[-1] else target
|
|
358
|
+
)
|
|
359
|
+
if sum(costs[ref] for ref in retained | refs_in_group) <= ceiling:
|
|
360
|
+
retained.update(refs_in_group)
|
|
361
|
+
protected_cost += group_cost
|
|
362
|
+
for unit in sorted(units, key=lambda unit: min(indexes[ref] for ref in unit), reverse=True):
|
|
363
|
+
proposal = retained | set(unit)
|
|
364
|
+
if sum(costs[ref] for ref in proposal) <= target:
|
|
365
|
+
retained = proposal
|
|
366
|
+
else:
|
|
367
|
+
# Keep a chronological suffix, not whichever older units are
|
|
368
|
+
# small. Replaying an early list/read after the fresh summary
|
|
369
|
+
# misrepresents the current execution position. Older source
|
|
370
|
+
# reads can only survive through the explicit working set.
|
|
371
|
+
break
|
|
372
|
+
return retained
|
|
373
|
+
|
|
374
|
+
def _read_working_set_groups(
|
|
375
|
+
self, metadata, active, groups, *, continuity=None, history=None, tools=()
|
|
376
|
+
):
|
|
377
|
+
"""Select bounded, complete source receipts with the correct freshness domain.
|
|
378
|
+
|
|
379
|
+
Tool output is historical and low trust. A later unknown or mutating
|
|
380
|
+
tool invalidates workspace observations because the planner cannot
|
|
381
|
+
attest to per-file freshness from transcript text alone. Already
|
|
382
|
+
observed, hash-bound artifact pages are immutable historical data.
|
|
383
|
+
"""
|
|
384
|
+
raw_by_ref = {item.message_id: raw for item, raw in zip(metadata, active)}
|
|
385
|
+
stale_historical_refs = (
|
|
386
|
+
frozenset(history.retained_message_refs)
|
|
387
|
+
if history is not None
|
|
388
|
+
and history.count
|
|
389
|
+
and (
|
|
390
|
+
continuity is None
|
|
391
|
+
or continuity.workspace_revision is None
|
|
392
|
+
or history.last_workspace_revision is None
|
|
393
|
+
or continuity.workspace_revision != history.last_workspace_revision
|
|
394
|
+
)
|
|
395
|
+
else frozenset()
|
|
396
|
+
)
|
|
397
|
+
names_by_call = {}
|
|
398
|
+
definitions = {tool.name: tool for tool in tools}
|
|
399
|
+
last_mutation = -1
|
|
400
|
+
for index, (item, raw) in enumerate(zip(metadata, active)):
|
|
401
|
+
if item.role != "assistant":
|
|
402
|
+
continue
|
|
403
|
+
for call in raw.get("tool_calls", ()):
|
|
404
|
+
function = call.get("function", {}) if isinstance(call, dict) else {}
|
|
405
|
+
name = function.get("name") if isinstance(function, dict) else None
|
|
406
|
+
call_id = call.get("id") if isinstance(call, dict) else None
|
|
407
|
+
if isinstance(call_id, str):
|
|
408
|
+
names_by_call[call_id] = (name, function.get("arguments"))
|
|
409
|
+
definition = definitions.get(name)
|
|
410
|
+
if definition is None or (
|
|
411
|
+
not definition.read_only and definition.context_role != "task_planning"
|
|
412
|
+
):
|
|
413
|
+
last_mutation = index
|
|
414
|
+
# A large source file is often read in bounded line ranges. Keeping
|
|
415
|
+
# only one receipt per path loses the rest of that working set at each
|
|
416
|
+
# compaction and makes the model reread the file indefinitely.
|
|
417
|
+
seen_ranges = set()
|
|
418
|
+
selected = []
|
|
419
|
+
indexes = {item.message_id: index for index, item in enumerate(metadata)}
|
|
420
|
+
for group in reversed(groups):
|
|
421
|
+
if len(seen_ranges) >= self.policy.read_working_set_count:
|
|
422
|
+
break
|
|
423
|
+
# Writes can have left the active transcript through compaction.
|
|
424
|
+
# Classify the complete batch before applying workspace freshness:
|
|
425
|
+
# immutable artifact observations do not attest to current files.
|
|
426
|
+
workspace_stale = (
|
|
427
|
+
not stale_historical_refs.isdisjoint(group)
|
|
428
|
+
or min(indexes[ref] for ref in group) <= last_mutation
|
|
429
|
+
)
|
|
430
|
+
calls = [
|
|
431
|
+
item for item in metadata if item.message_id in group and item.role == "assistant"
|
|
432
|
+
]
|
|
433
|
+
results = [
|
|
434
|
+
item for item in metadata if item.message_id in group and item.role == "tool"
|
|
435
|
+
]
|
|
436
|
+
if len(calls) != 1 or len(results) != len(calls[0].tool_call_ids):
|
|
437
|
+
continue
|
|
438
|
+
identities = set()
|
|
439
|
+
immutable_artifact_batch = True
|
|
440
|
+
for result in results:
|
|
441
|
+
name, arguments = names_by_call.get(result.tool_result_for, (None, None))
|
|
442
|
+
definition = definitions.get(name)
|
|
443
|
+
if definition is None or definition.context_role != "artifact_read":
|
|
444
|
+
immutable_artifact_batch = False
|
|
445
|
+
if definition is not None and definition.context_role == "task_planning":
|
|
446
|
+
try:
|
|
447
|
+
planning = json.loads(raw_by_ref[result.message_id].get("content", ""))
|
|
448
|
+
except (TypeError, ValueError):
|
|
449
|
+
break
|
|
450
|
+
if not isinstance(planning, dict) or planning.get("status") != "ok":
|
|
451
|
+
break
|
|
452
|
+
# A host-owned planning update changes its task list, not
|
|
453
|
+
# source files. Preserve the entire mixed call/result batch
|
|
454
|
+
# without treating its planning status as acceptance.
|
|
455
|
+
continue
|
|
456
|
+
if definition is not None and definition.context_role == "workspace_search":
|
|
457
|
+
request = _unambiguous_json_object(arguments)
|
|
458
|
+
if complete_search_observation(
|
|
459
|
+
raw_by_ref[result.message_id], arguments=request
|
|
460
|
+
) is None:
|
|
461
|
+
break
|
|
462
|
+
# Keep the complete actual batch, including all returned
|
|
463
|
+
# matches. A repeated query is one source slot; neither
|
|
464
|
+
# its presence nor this identity attests to file freshness.
|
|
465
|
+
identities.add(("search", hashlib.sha256(_json(request).encode()).hexdigest()))
|
|
466
|
+
continue
|
|
467
|
+
if definition is not None and definition.context_role == "artifact_read":
|
|
468
|
+
request = _unambiguous_json_object(arguments)
|
|
469
|
+
observed = artifact_page_observation(
|
|
470
|
+
raw_by_ref[result.message_id], arguments=request
|
|
471
|
+
)
|
|
472
|
+
if observed is None:
|
|
473
|
+
break
|
|
474
|
+
page = _unambiguous_json_object(observed["content"])["content"]
|
|
475
|
+
# Immutable host artifact coordinates are a source slot,
|
|
476
|
+
# not evidence of workspace freshness or complete source.
|
|
477
|
+
identities.add(("artifact", page["uri"], page["content_hash"],
|
|
478
|
+
page["offset_chars"], page["next_offset_chars"]))
|
|
479
|
+
continue
|
|
480
|
+
if (
|
|
481
|
+
definition is None
|
|
482
|
+
or definition.context_role != "workspace_read"
|
|
483
|
+
or not isinstance(arguments, str)
|
|
484
|
+
):
|
|
485
|
+
break
|
|
486
|
+
try:
|
|
487
|
+
request = json.loads(arguments)
|
|
488
|
+
path = request.get("path")
|
|
489
|
+
receipt = json.loads(raw_by_ref[result.message_id].get("content", ""))
|
|
490
|
+
except (TypeError, ValueError, AttributeError):
|
|
491
|
+
break
|
|
492
|
+
content = receipt.get("content") if isinstance(receipt, dict) else None
|
|
493
|
+
if (
|
|
494
|
+
not isinstance(path, str)
|
|
495
|
+
or not path
|
|
496
|
+
or not isinstance(receipt, dict)
|
|
497
|
+
or receipt.get("status") != "ok"
|
|
498
|
+
or not isinstance(content, dict)
|
|
499
|
+
or content.get("ok") is not True
|
|
500
|
+
or content.get("path") != path
|
|
501
|
+
or not isinstance(content.get("content"), str)
|
|
502
|
+
):
|
|
503
|
+
break
|
|
504
|
+
read_range = content.get("read_range")
|
|
505
|
+
if isinstance(read_range, dict):
|
|
506
|
+
start, end = read_range.get("start"), read_range.get("end")
|
|
507
|
+
if type(start) is not int or type(end) is not int or start < 1 or end < start:
|
|
508
|
+
break
|
|
509
|
+
identity = (path, start, end)
|
|
510
|
+
else:
|
|
511
|
+
identity = (path, None, None)
|
|
512
|
+
identities.add(identity)
|
|
513
|
+
else:
|
|
514
|
+
if workspace_stale and not immutable_artifact_batch:
|
|
515
|
+
continue
|
|
516
|
+
# Preserve the complete assistant/result batch. Splitting it
|
|
517
|
+
# would orphan tool results; duplicate ranges within a batch
|
|
518
|
+
# do not consume extra source slots.
|
|
519
|
+
new_ranges = identities - seen_ranges
|
|
520
|
+
if (
|
|
521
|
+
new_ranges
|
|
522
|
+
and len(seen_ranges | identities) <= self.policy.read_working_set_count
|
|
523
|
+
):
|
|
524
|
+
seen_ranges.update(identities)
|
|
525
|
+
selected.append(group)
|
|
526
|
+
return selected
|