agentengine-sdk-python 0.8.4__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.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +17 -10
- agentengine_sdk_python-0.8.6.dist-info/RECORD +1731 -0
- 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/_process.py +83 -0
- ksadk/_str_enum.py +17 -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/a2ui/core.py +3 -3
- ksadk/api/client.py +38 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +121 -118
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +22 -2
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/__init__.py +36 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_config.py +4 -4
- ksadk/cli/cmd_create.py +12 -12
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_hermes.py +24 -2
- ksadk/cli/cmd_invoke.py +64 -88
- ksadk/cli/cmd_openclaw.py +26 -1
- ksadk/cli/cmd_plugin.py +70 -12
- ksadk/cli/cmd_studio.py +69 -17
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/openclaw_env.py +1 -1
- ksadk/cli/resource_common.py +26 -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 -1047
- 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/__init__.py +1 -1
- ksadk/configs/env_registry.py +216 -143
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +134 -0
- ksadk/configs/global_config.py +2 -1
- ksadk/configs/settings.py +9 -3
- ksadk/connector/__init__.py +17 -0
- ksadk/connector/channel.py +477 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/capabilities.py +52 -4
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachment_storage.py +10 -3
- ksadk/conversations/attachments.py +69 -20
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +51 -155
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/normalize.py +28 -10
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_baseline.py +37 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_invocation.py +17 -4
- ksadk/conversations/runtime_observability.py +39 -10
- ksadk/conversations/runtime_payloads.py +12 -0
- ksadk/conversations/runtime_persistence.py +296 -32
- ksadk/conversations/runtime_preparation.py +98 -13
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/runtime_stream_events.py +29 -35
- ksadk/conversations/runtime_streaming.py +8 -0
- 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/_codex_items.py +16 -8
- ksadk/events/adapters/_langgraph_support.py +46 -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/events/session_event.py +2 -2
- ksadk/harness/__init__.py +18 -0
- ksadk/harness/app.py +11 -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 +230 -0
- 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/capabilities.py +115 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +332 -0
- ksadk/harness/closure_contract.py +92 -0
- ksadk/harness/compaction_record.py +153 -0
- ksadk/harness/compiler.py +284 -0
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/__init__.py +33 -0
- ksadk/harness/conformance/contract.py +504 -0
- ksadk/harness/conformance/fixtures.py +102 -0
- ksadk/harness/context_engine.py +388 -0
- ksadk/harness/context_maintenance.py +259 -0
- ksadk/harness/context_manifest.py +188 -0
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/context_tuning.py +168 -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/draft_runtime.py +322 -0
- ksadk/harness/engine/__init__.py +40 -0
- ksadk/harness/engine/base.py +122 -0
- ksadk/harness/engine/budgets.py +108 -0
- ksadk/harness/engine/capability_declarations.py +59 -0
- ksadk/harness/engine/completion_guard.py +57 -0
- ksadk/harness/engine/context_pipeline.py +1351 -0
- ksadk/harness/engine/graph_builder.py +352 -0
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +1049 -0
- ksadk/harness/engine/mcp_disclosure.py +701 -0
- 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 +81 -0
- ksadk/harness/engine/postgres_checkpointer.py +386 -0
- ksadk/harness/engine/run_control_bridge.py +100 -0
- ksadk/harness/engine/run_types.py +98 -0
- ksadk/harness/engine/skill_disclosure.py +275 -0
- ksadk/harness/engine/spans.py +41 -0
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +360 -0
- ksadk/harness/engine/thread_ids.py +112 -0
- ksadk/harness/engine/tool_dispatch.py +249 -0
- ksadk/harness/event_tree.py +212 -0
- ksadk/harness/events.py +498 -0
- ksadk/harness/execution_policy.py +104 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/insights.py +210 -0
- ksadk/harness/lifecycle.py +578 -0
- ksadk/harness/lifecycle_conformance.py +233 -0
- ksadk/harness/lifecycle_local_plane.py +104 -0
- ksadk/harness/loop/__init__.py +44 -0
- ksadk/harness/loop/reason.py +699 -0
- ksadk/harness/loop/tools.py +907 -0
- ksadk/harness/managed_runtime.py +1044 -0
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_matrix.py +474 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +504 -0
- ksadk/harness/memory_consolidation.py +157 -0
- ksadk/harness/memory_loop.py +156 -0
- ksadk/harness/memory_runtime.py +541 -0
- ksadk/harness/metrics.py +90 -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 +468 -0
- ksadk/harness/model_provider.py +430 -0
- 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/observability/__init__.py +29 -0
- ksadk/harness/observability/inspection.py +528 -0
- ksadk/harness/observability/metrics.py +167 -0
- ksadk/harness/observability/otel_exporter.py +218 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +132 -0
- ksadk/harness/public_activity.py +213 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/readiness.py +249 -0
- ksadk/harness/reasoner.py +779 -17
- ksadk/harness/release_readiness.py +140 -0
- ksadk/harness/resource_ref.py +69 -0
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +773 -0
- ksadk/harness/runtime.py +157 -113
- ksadk/harness/runtime_capabilities.py +228 -0
- ksadk/harness/runtime_server.py +514 -0
- ksadk/harness/sandbox_adapters.py +739 -0
- ksadk/harness/sandbox_backend.py +733 -0
- ksadk/harness/sandbox_conformance.py +288 -0
- ksadk/harness/sandbox_lease.py +77 -0
- ksadk/harness/sandbox_lease_conformance.py +259 -0
- ksadk/harness/sandbox_matrix.py +170 -0
- ksadk/harness/sandbox_reconciliation.py +140 -0
- ksadk/harness/sandbox_recovery.py +586 -0
- ksadk/harness/sandbox_recovery_conformance.py +246 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +589 -0
- 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_composition.py +212 -0
- ksadk/harness/skill_feedback.py +123 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_matrix.py +233 -0
- ksadk/harness/skill_runtime.py +317 -0
- ksadk/harness/spec.py +342 -0
- ksadk/harness/state.py +155 -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/strategies.py +149 -0
- ksadk/harness/subagent.py +263 -0
- 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 +134 -0
- ksadk/harness/tool_receipts.py +96 -0
- ksadk/harness/tool_reliability.py +81 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/user_errors.py +69 -0
- ksadk/harness/working_context.py +81 -0
- ksadk/harness/working_context_patch.py +99 -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/identity/resolver.py +18 -0
- ksadk/interaction/__init__.py +1 -1
- ksadk/interaction/ledger.py +1 -1
- ksadk/interaction/provider.py +1 -1
- ksadk/interaction/providers/__init__.py +3 -1
- ksadk/interaction/providers/adk.py +1 -1
- ksadk/interaction/providers/codex.py +1 -1
- ksadk/interaction/providers/harness.py +50 -0
- ksadk/interaction/providers/langgraph.py +9 -2
- ksadk/kernel/__init__.py +10 -0
- ksadk/kernel/approval_presentation.py +91 -0
- ksadk/kernel/authorization.py +1 -1
- ksadk/kernel/bootstrap.py +220 -252
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +30 -0
- ksadk/kernel/control.py +180 -29
- ksadk/kernel/execution_grants.py +428 -0
- ksadk/kernel/execution_grants_memory.py +252 -0
- ksadk/kernel/execution_grants_postgres.py +395 -0
- ksadk/kernel/execution_grants_sqlite.py +435 -0
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +139 -226
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/mapping.py +1 -1
- ksadk/kernel/memory_store.py +61 -58
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +230 -231
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +166 -16
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +28 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +410 -200
- ksadk/kernel/state.py +2 -3
- ksadk/kernel/store.py +104 -5
- 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 +369 -340
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_history.py +72 -0
- ksadk/kernel/worker_identity.py +74 -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/coordinator.py +22 -6
- ksadk/memory/extraction.py +159 -7
- ksadk/memory/models.py +77 -1
- ksadk/memory/provider_resolver.py +5 -0
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_postgres.py +200 -0
- ksadk/memory/providers/local_sqlite.py +280 -67
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/memory/retrieval.py +189 -0
- ksadk/memory/store_adapter.py +150 -0
- 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_policy.py +2 -2
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/detect.py +254 -0
- ksadk/model_proxy/server.py +14 -9
- ksadk/model_proxy/transform.py +72 -6
- ksadk/plugins/__init__.py +1 -1
- ksadk/plugins/bridges/dsh.py +29 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +417 -185
- ksadk/plugins/companion_artifacts.py +83 -0
- ksadk/plugins/companions.py +368 -0
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/contracts.py +1 -1
- ksadk/plugins/dsh_channels.py +156 -0
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_home.py +140 -0
- ksadk/plugins/dsh_teams.py +105 -0
- ksadk/plugins/dsh_toolchain.py +92 -21
- ksadk/plugins/execution_host.py +107 -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-channels-client/client.js +19 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/index.mjs +7 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/package.json +12 -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-client/client.js +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/index.mjs +11 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/package.json +35 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/index.mjs +13 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/index.mjs +12 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/package.json +26 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/index.mjs +25 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/tools.json +235 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +51 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +2 -2
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/client.mjs +133 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/index.mjs +14 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +27 -4
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +9 -5
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
- ksadk/plugins/providers/codex.py +52 -40
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +49 -143
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +413 -52
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +670 -0
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +550 -0
- ksadk/plugins/providers/harness_tools.py +455 -0
- 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/providers/shipped_dsh.py +4 -1
- ksadk/plugins/subagent_providers/codex.py +28 -6
- ksadk/plugins/teams/__init__.py +5 -0
- ksadk/plugins/teams/api.py +405 -0
- ksadk/plugins/teams/application.py +540 -0
- ksadk/plugins/teams/artifacts.py +60 -0
- 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/context.py +96 -0
- ksadk/plugins/teams/contracts.py +136 -0
- ksadk/plugins/teams/domain.py +1480 -0
- ksadk/plugins/teams/domain_values.py +24 -0
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/errors.py +13 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/migration.py +311 -0
- ksadk/plugins/teams/migration_cli.py +322 -0
- ksadk/plugins/teams/postgres_store.py +352 -0
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +853 -0
- ksadk/plugins/teams/source_projection.py +84 -0
- ksadk/plugins/teams/store.py +519 -0
- ksadk/plugins/teams/task_decisions.py +436 -0
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +96 -0
- ksadk/plugins/teams/workspaces.py +255 -0
- 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 +83 -401
- ksadk/runners/_langgraph_state_reader.py +106 -0
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/_session_identity.py +285 -0
- ksadk/runners/adk_runner.py +220 -350
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +208 -195
- ksadk/runners/patch_langchain.py +47 -0
- ksadk/runners/usage_accumulator.py +11 -3
- 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 +134 -129
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +29 -3
- ksadk/runtime/executor.py +105 -7
- ksadk/runtime/factory.py +45 -3
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/preprocessing.py +11 -3
- ksadk/runtime/runner_adapter.py +160 -21
- ksadk/runtime/skill_eval_result.py +36 -0
- ksadk/runtime/timing.py +46 -0
- ksadk/runtime/usage.py +49 -18
- ksadk/runtime_context.py +105 -1
- ksadk/sandbox/backends/e2b.py +272 -24
- ksadk/sandbox/backends/local_process.py +73 -39
- ksadk/sandbox/base.py +62 -1
- ksadk/sandbox/diagnostics.py +82 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +776 -0
- ksadk/sandbox/local_launcher.py +124 -0
- ksadk/scheduler/dispatcher.py +1 -1
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/invocation_identity.py +118 -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/common.py +32 -3
- ksadk/server/routes/control.py +112 -9
- ksadk/server/routes/dependencies.py +2 -1
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +26 -3
- ksadk/server/routes/misc.py +331 -33
- ksadk/server/routes/models.py +28 -4
- ksadk/server/routes/openai_compat.py +82 -13
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +112 -37
- ksadk/server/routes/sessions.py +493 -358
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +135 -23
- ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-BVrNVtJC.js} +10 -7
- ksadk/server/static/assets/MathMessageMarkdown-Dp7c4wWD.js +8 -0
- ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-Dxop8Rd7.js} +9 -9
- ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-bTohInsS.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.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-DkhehZDr.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.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-Bf9D3tzJ.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-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-BgV_owcB.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-BBsYarrI.js} +2 -2
- ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-Cf125P_m.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DVCOWtha.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-DiixqL0J.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/dist-bupkyEBZ.js +1 -0
- ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-btbmmX5O.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.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-Cp_r9Hb6.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-Dlhc8Wr8.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-CO0rRTRA.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-B4weu383.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.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-D7genGLl.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.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-CCsh3avW.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.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-BSKgJsmR.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +34 -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/invocation_identity.py +235 -0
- 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/__init__.py +26 -0
- ksadk/skills/events.py +464 -0
- ksadk/skills/loader.py +44 -2
- ksadk/skills/manifest_cache.py +263 -0
- ksadk/skills/mcp_server/__init__.py +0 -0
- ksadk/skills/mcp_server/_registry.py +33 -0
- ksadk/skills/mcp_server/_routing.py +26 -0
- ksadk/skills/mcp_server/_workspace_files.py +160 -0
- ksadk/skills/mcp_server/register.py +415 -0
- ksadk/skills/mcp_server/server.py +218 -0
- ksadk/skills/models.py +11 -0
- ksadk/skills/observability.py +132 -0
- ksadk/skills/package_store.py +75 -2
- ksadk/skills/runtime/agent.py +38 -5
- ksadk/skills/runtime/artifacts.py +87 -0
- ksadk/skills/runtime/backends/e2b.py +400 -56
- ksadk/skills/runtime/backends/local.py +621 -119
- ksadk/skills/runtime/base.py +78 -7
- ksadk/skills/runtime/executor.py +266 -1
- ksadk/skills/runtime/loader.py +108 -3
- ksadk/skills/runtime/request.py +18 -0
- ksadk/skills/service_client.py +6 -1
- ksadk/skills/tool_defs.py +108 -3
- 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 +784 -419
- 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 +31 -2
- ksadk/studio/api_plugin_routes.py +39 -12
- ksadk/studio/api_resource_connections.py +79 -41
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/authoring.py +12 -6
- ksadk/studio/authoring_coordinator.py +4 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +32 -2
- ksadk/studio/capabilities.py +31 -9
- ksadk/studio/channel_connections.py +333 -0
- ksadk/studio/cloud.py +113 -387
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +82 -2
- ksadk/studio/codex_agent_service.py +19 -2
- ksadk/studio/codex_builder.py +1 -1
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/codex_run.py +6 -1
- ksadk/studio/compiler.py +112 -6
- ksadk/studio/configuration.py +182 -0
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +260 -202
- ksadk/studio/dsh_application.py +183 -27
- ksadk/studio/dsh_capability_service.py +302 -189
- ksadk/studio/dsh_lifecycle.py +58 -0
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/dsh_provider_registration.py +55 -16
- ksadk/studio/entry.py +53 -0
- ksadk/studio/event_store.py +53 -5
- ksadk/studio/execution_host.py +598 -0
- ksadk/studio/framework_run.py +50 -10
- ksadk/studio/hosted_kernel.py +1 -1
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +429 -0
- ksadk/studio/kernel_sqlite_migration.py +181 -0
- 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 +1939 -345
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +89 -40
- 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_documents.py +172 -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 +39 -12
- ksadk/studio/plugin_kernel_adapter.py +89 -0
- ksadk/studio/plugin_lifecycle.py +80 -0
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +832 -99
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/provider_recovery.py +59 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/recovery_page.py +70 -0
- ksadk/studio/resource_authority.py +69 -34
- ksadk/studio/resource_catalog.py +14 -12
- ksadk/studio/run_activity.py +848 -0
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_documents.py +127 -0
- ksadk/studio/run_service.py +1220 -335
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +73 -11
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/runtime_source.py +1 -1
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/scheduler_runtime.py +32 -289
- ksadk/studio/service.py +615 -246
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +518 -181
- 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-CkufcPYo.js +44 -0
- ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
- ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-BeyLyQHu.js +59 -0
- ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-Bnb1O3tA.js +1 -0
- ksadk/studio/static/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-5Zn1gqJv.js +36 -0
- ksadk/studio/static/assets/{blockDiagram-I7D4REHJ-CFmPl1de.js → blockDiagram-I7D4REHJ-CLB4L11u.js} +6 -6
- ksadk/studio/static/assets/{c4Diagram-7LVT6UL2-BRrGu8qt.js → c4Diagram-7LVT6UL2-BOma_Z_F.js} +7 -7
- ksadk/studio/static/assets/channel-r8itPEik.js +1 -0
- ksadk/studio/static/assets/chunk-2E4U76K2-BFf_huql.js +2 -0
- ksadk/studio/static/assets/chunk-2ZTRR5NV-C2qZJila.js +2 -0
- ksadk/studio/static/assets/chunk-3Z5EZCMW-DMniOlPd.js +1 -0
- ksadk/studio/static/assets/{chunk-4HAMMTFA-D220vUtq.js → chunk-4HAMMTFA-DVtDP4rm.js} +7 -7
- ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
- ksadk/studio/static/assets/chunk-6AZGARVD-BB6FqMl-.js +1 -0
- ksadk/studio/static/assets/chunk-6EIED4P4-DdUJkP0f.js +1 -0
- ksadk/studio/static/assets/chunk-6K3QC6MW-CqVsVn-y.js +1 -0
- ksadk/studio/static/assets/chunk-6TQVIW2G-DKlLbNIP.js +1 -0
- ksadk/studio/static/assets/chunk-747NJXEK-BFkZPlab.js +2 -0
- ksadk/studio/static/assets/chunk-75Z2AOVW-BZNhM4vB.js +2 -0
- ksadk/studio/static/assets/chunk-CLGD4ZFX-D-GTtyKs.js +1 -0
- ksadk/studio/static/assets/{chunk-DU6HZSFF-C4DtVpCu.js → chunk-DU6HZSFF-CpEZCUgg.js} +1 -1
- ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
- ksadk/studio/static/assets/{chunk-GMAD6QVW-DiQA-u2N.js → chunk-GMAD6QVW-DE_8H717.js} +6 -6
- ksadk/studio/static/assets/chunk-GVQU2GXP-BfEB0lNv.js +1 -0
- ksadk/studio/static/assets/chunk-I5DQTOEV-Hm2LfiYI.js +1 -0
- ksadk/studio/static/assets/chunk-ICYGCRZG-749o-pGJ.js +1 -0
- ksadk/studio/static/assets/chunk-IH6LHLGP-CC6I9F3i.js +1 -0
- ksadk/studio/static/assets/{chunk-IMKFNOWR-BSlbjT_b.js → chunk-IMKFNOWR-D38axYOR.js} +5 -5
- ksadk/studio/static/assets/chunk-KI3K4JFJ-Rma-0k_M.js +1 -0
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Dq5xn7aL.js +1 -0
- ksadk/studio/static/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
- ksadk/studio/static/assets/{chunk-OSK3NFVY-M2m6G3j4.js → chunk-OSK3NFVY-DiCQjx9b.js} +5 -5
- ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
- ksadk/studio/static/assets/{chunk-P2QGCYS3-DezaQxiK.js → chunk-P2QGCYS3-VdhKmfYq.js} +1 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-C1_rzO5M.js +1 -0
- ksadk/studio/static/assets/chunk-PWAF6VOD-B45HvflI.js +1 -0
- ksadk/studio/static/assets/{chunk-SHT3W25Y-DAyIVp5H.js → chunk-SHT3W25Y-DsCFnRVE.js} +9 -9
- ksadk/studio/static/assets/{chunk-SVP7TREG-DulomOrS.js → chunk-SVP7TREG-DljApgRX.js} +1 -1
- ksadk/studio/static/assets/{chunk-TICWLB2K-bHJYoflj.js → chunk-TICWLB2K-DWqRtyqa.js} +6 -6
- ksadk/studio/static/assets/chunk-TLUHSLCS-DUeGgnD5.js +2 -0
- ksadk/studio/static/assets/chunk-UY3FDG6J-CnmaAkG5.js +1 -0
- ksadk/studio/static/assets/chunk-XHIXRSVI-BFQ6B8BE.js +1 -0
- ksadk/studio/static/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/clsx-DB0hHKMi.js +1 -0
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-om8AY0Mc.js +1 -0
- ksadk/studio/static/assets/createLucideIcon-DR0LGTP5.js +1 -0
- ksadk/studio/static/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-6BrmK52S.js +62 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
- ksadk/studio/static/assets/{diagram-S7CK7UJ4-0BZ98mya.js → diagram-S7CK7UJ4-C6aH78c4.js} +3 -3
- ksadk/studio/static/assets/diagram-UQ7AKVKN-DY_tQ6C_.js +41 -0
- ksadk/studio/static/assets/diagram-VSXAHHWV-DX9p5cQT.js +3 -0
- ksadk/studio/static/assets/diagram-VX7I27RA-DB2WSH8X.js +24 -0
- ksadk/studio/static/assets/diagram-Z3DM3KII-Ce1BJwHE.js +24 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
- ksadk/studio/static/assets/{erDiagram-RLTQ6QDP-DLGry2Ap.js → erDiagram-RLTQ6QDP-CGthTMmJ.js} +6 -6
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
- ksadk/studio/static/assets/flowDiagram-HODETNUW-CZ1tEenp.js +1 -0
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BfoAZW9X.js +292 -0
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-S985OIJF.js +106 -0
- ksadk/studio/static/assets/iconfont-4HN3C9Pg.woff2 +0 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/assets/index.dom-BQenBtFm.js +1 -0
- ksadk/studio/static/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-CO3W8tFn.js +2 -0
- ksadk/studio/static/assets/{ishikawaDiagram-5VMMS53U-CljI2wyf.js → ishikawaDiagram-5VMMS53U-BUGEl8cO.js} +2 -2
- ksadk/studio/static/assets/{journeyDiagram-3NMN7TZE-D50Fo2sL.js → journeyDiagram-3NMN7TZE-Ch2ZYxvr.js} +6 -6
- ksadk/studio/static/assets/{kanban-definition-UXKFOSKX-DimfOTam.js → kanban-definition-UXKFOSKX-Da-Fp4vC.js} +3 -3
- ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
- ksadk/studio/static/assets/{line-CX5BOOUP.js → line-BDaeq300.js} +1 -1
- ksadk/studio/static/assets/linear-DmucvK78.js +1 -0
- ksadk/studio/static/assets/mermaid-parser.core-Cj5mYdBi.js +4 -0
- ksadk/studio/static/assets/{mindmap-definition-YA3MSWOX-Bizzqy5R.js → mindmap-definition-YA3MSWOX-CvlsVQ38.js} +1 -1
- ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-BuHuNgT5.js +1 -0
- ksadk/studio/static/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
- ksadk/studio/static/assets/{pieDiagram-E7YTZNPT-B9mrFSDF.js → pieDiagram-E7YTZNPT-DlrWiSOv.js} +1 -1
- ksadk/studio/static/assets/preload-helper-CO68xz6u.js +1 -0
- ksadk/studio/static/assets/presentation-yYw7xK60-BmcZriri.js +1 -0
- ksadk/studio/static/assets/{quadrantDiagram-AXDQQJYC-NzUfCbMR.js → quadrantDiagram-AXDQQJYC-BA3hpUZM.js} +6 -6
- ksadk/studio/static/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
- ksadk/studio/static/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-BxpAazym.js +1 -0
- ksadk/studio/static/assets/{requirementDiagram-BXWQKSXE-BF3d103U.js → requirementDiagram-BXWQKSXE-E-Ge0FcV.js} +1 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
- ksadk/studio/static/assets/{sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js → sequenceDiagram-WJ2MYXX4-CcElXGg4.js} +9 -9
- ksadk/studio/static/assets/src-B6xuSHsQ.js +1 -0
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DdXZOFqY.js +1 -0
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-CJbOM-QK.js +1 -0
- ksadk/studio/static/assets/swimlanes-42K2YHIH-NtgEEHLY.js +1 -0
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-D-AVlW8B.js +8 -0
- ksadk/studio/static/assets/{timeline-definition-24CTP7MA-DxmSSjRB.js → timeline-definition-24CTP7MA-CIuYhNy3.js} +7 -7
- ksadk/studio/static/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
- ksadk/studio/static/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-7HbApbrv.js +34 -0
- ksadk/studio/static/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
- ksadk/studio/static/assets/{wardleyDiagram-VM6X3IG4-Ba1AOWoe.js → wardleyDiagram-VM6X3IG4-CMJiaedy.js} +1 -1
- ksadk/studio/static/assets/{xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js → xychartDiagram-S5SC5T6Z-BdgtMvW2.js} +6 -6
- ksadk/studio/static/index.html +8 -2
- ksadk/studio/teams_catalog.py +166 -0
- ksadk/studio/teams_installation.py +217 -0
- ksadk/studio/teams_node.py +549 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +72 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +496 -0
- ksadk/studio/templates.py +41 -19
- ksadk/studio/validator.py +13 -0
- ksadk/studio/workspace.py +19 -4
- ksadk/studio/workspace_plugins.py +138 -0
- ksadk/studio/workspace_registry.py +286 -0
- 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 +93 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/skills.py +446 -378
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +344 -326
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_identity.py +15 -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/memory_backend/providers/lancedb.py +56 -2
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -148
- ksadk_runtime_common/workspace_files/router.py +28 -14
- agentengine_sdk_python-0.8.4.dist-info/RECORD +0 -1070
- ksadk/server/static/assets/MathMessageMarkdown-DbdW5A4_.js +0 -8
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +0 -1
- ksadk/server/static/assets/channel-CF5Up3hQ.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +0 -1
- ksadk/server/static/assets/dist-B2_CVgKv.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +0 -1
- ksadk/server/static/assets/index-DcTML1Up.css +0 -2
- ksadk/server/static/assets/index-Dh2XHqPK.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +0 -1
- ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +0 -41
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +0 -8
- ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +0 -44
- ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +0 -3
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +0 -1
- ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +0 -1
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +0 -36
- ksadk/studio/static/assets/channel-BqO-gtEw.js +0 -1
- ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +0 -2
- ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +0 -1
- ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +0 -1
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +0 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +0 -1
- ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +0 -1
- ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +0 -1
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +0 -1
- ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +0 -1
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +0 -62
- ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +0 -4
- ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +0 -41
- ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +0 -3
- ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +0 -24
- ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +0 -24
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +0 -1
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +0 -1
- ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +0 -1
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +0 -292
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +0 -1
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +0 -106
- ksadk/studio/static/assets/index-CeHL9ARV.css +0 -2
- ksadk/studio/static/assets/index-D9QEcVpL.js +0 -320
- ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +0 -1
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +0 -2
- ksadk/studio/static/assets/linear-BCxN9JLv.js +0 -1
- ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +0 -7
- ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +0 -1
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +0 -1
- ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +0 -1
- ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +0 -1
- ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +0 -1
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +0 -1
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +0 -1
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +0 -1
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +0 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +0 -40
- ksadk/studio/static/assets/src-SFn9St9H.js +0 -1
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +0 -1
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +0 -1
- ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +0 -1
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +0 -8
- ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +0 -1
- ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +0 -1
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +0 -34
- ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +0 -1
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
- /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
ksadk/toolsets/workspace.py
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import ast
|
|
4
|
-
import difflib
|
|
5
4
|
import fnmatch
|
|
5
|
+
import hashlib
|
|
6
6
|
import json
|
|
7
7
|
import re
|
|
8
8
|
import shutil
|
|
9
|
-
import
|
|
9
|
+
from dataclasses import replace
|
|
10
|
+
from functools import wraps
|
|
10
11
|
from pathlib import Path
|
|
11
12
|
from typing import Any, Callable
|
|
12
13
|
|
|
@@ -14,7 +15,35 @@ from ksadk.sessions.local_service import resolve_local_session_dir
|
|
|
14
15
|
from ksadk.tools.gateway import ToolPolicy, default_tool_gateway
|
|
15
16
|
from ksadk.tools.result_budget import budget_tool_output, default_tool_result_budget
|
|
16
17
|
from ksadk.toolsets._langchain import as_tool
|
|
17
|
-
from ksadk.toolsets.
|
|
18
|
+
from ksadk.toolsets.workspace_editing import (
|
|
19
|
+
_apply_single_edit,
|
|
20
|
+
_budget_diff,
|
|
21
|
+
_build_diff,
|
|
22
|
+
_commit_workspace_edit,
|
|
23
|
+
_dict_result,
|
|
24
|
+
_read_workspace_text,
|
|
25
|
+
_refresh_read_state,
|
|
26
|
+
_validate_read_state,
|
|
27
|
+
_validate_single_edit_request,
|
|
28
|
+
)
|
|
29
|
+
from ksadk.toolsets.workspace_editing import (
|
|
30
|
+
_find_actual_string as _find_actual_string,
|
|
31
|
+
)
|
|
32
|
+
from ksadk.toolsets.workspace_editing import (
|
|
33
|
+
_match_previews as _match_previews,
|
|
34
|
+
)
|
|
35
|
+
from ksadk.toolsets.workspace_editing import (
|
|
36
|
+
_nearby_candidates as _nearby_candidates,
|
|
37
|
+
)
|
|
38
|
+
from ksadk.toolsets.workspace_editing import (
|
|
39
|
+
_normalize_quotes as _normalize_quotes,
|
|
40
|
+
)
|
|
41
|
+
from ksadk.toolsets.workspace_identity import identity_workspace_root
|
|
42
|
+
from ksadk.toolsets.workspace_mutation import locked_workspace_paths, publish_workspace_bytes
|
|
43
|
+
from ksadk.toolsets.workspace_read_budget import current_source_read_budget
|
|
44
|
+
from ksadk.toolsets.workspace_search import search_payload as _search_payload
|
|
45
|
+
from ksadk.toolsets.workspace_state import WorkspaceReadState, record_read_state
|
|
46
|
+
from ksadk.toolsets.workspace_state import get_read_state as get_read_state
|
|
18
47
|
|
|
19
48
|
_WORKSPACE_TOOL_POLICIES = {
|
|
20
49
|
"workspace_status": ToolPolicy(risk_level="low"),
|
|
@@ -34,14 +63,8 @@ def _gateway():
|
|
|
34
63
|
return default_tool_gateway(_WORKSPACE_TOOL_POLICIES)
|
|
35
64
|
|
|
36
65
|
|
|
37
|
-
def _dict_result(value: Any, *, tool_name: str) -> dict[str, Any]:
|
|
38
|
-
if not isinstance(value, dict):
|
|
39
|
-
raise TypeError(f"{tool_name} returned {type(value).__name__}, expected dict")
|
|
40
|
-
return dict(value)
|
|
41
|
-
|
|
42
|
-
|
|
43
66
|
def workspace_root() -> Path:
|
|
44
|
-
return Path(resolve_local_session_dir()) / "workspace"
|
|
67
|
+
return identity_workspace_root(Path(resolve_local_session_dir()) / "workspace")
|
|
45
68
|
|
|
46
69
|
|
|
47
70
|
def resolve_workspace_path(relative_path: str) -> Path:
|
|
@@ -57,9 +80,17 @@ def workspace_relative(path: Path) -> str:
|
|
|
57
80
|
return path.resolve().relative_to(workspace_root().resolve()).as_posix()
|
|
58
81
|
|
|
59
82
|
|
|
83
|
+
def _workspace_file_guard(function):
|
|
84
|
+
"""Serialize the admitted file operation; approval remains outside this lock."""
|
|
85
|
+
@wraps(function)
|
|
86
|
+
def guarded(path, *args, **kwargs):
|
|
87
|
+
with locked_workspace_paths((resolve_workspace_path(path),)):
|
|
88
|
+
return function(path, *args, **kwargs)
|
|
89
|
+
return guarded
|
|
90
|
+
|
|
91
|
+
|
|
60
92
|
def workspace_status() -> dict[str, Any]:
|
|
61
93
|
"""Return current AgentEngine workspace status."""
|
|
62
|
-
|
|
63
94
|
return _dict_result(
|
|
64
95
|
_gateway().invoke("workspace_status", _workspace_status_impl),
|
|
65
96
|
tool_name="workspace_status",
|
|
@@ -200,6 +231,7 @@ def read_workspace_file(
|
|
|
200
231
|
)
|
|
201
232
|
|
|
202
233
|
|
|
234
|
+
@_workspace_file_guard
|
|
203
235
|
def _read_workspace_file_impl(
|
|
204
236
|
path: str,
|
|
205
237
|
start_line: int | None = None,
|
|
@@ -214,7 +246,11 @@ def _read_workspace_file_impl(
|
|
|
214
246
|
if stat.st_size > 2 * 1024 * 1024:
|
|
215
247
|
return {"ok": False, "error_message": "file is larger than 2MB"}
|
|
216
248
|
try:
|
|
217
|
-
|
|
249
|
+
with target.open("rb") as source:
|
|
250
|
+
payload = source.read(2 * 1024 * 1024 + 1)
|
|
251
|
+
if len(payload) > 2 * 1024 * 1024:
|
|
252
|
+
return {"ok": False, "error_message": "file is larger than 2MB"}
|
|
253
|
+
text = payload.decode("utf-8")
|
|
218
254
|
except UnicodeDecodeError:
|
|
219
255
|
return {"ok": False, "error_message": "file is not utf-8 text"}
|
|
220
256
|
lines = text.splitlines()
|
|
@@ -222,61 +258,200 @@ def _read_workspace_file_impl(
|
|
|
222
258
|
start = max(1, int(start_line or 1))
|
|
223
259
|
end = min(total_lines, int(end_line or total_lines)) if total_lines else 0
|
|
224
260
|
if end and start > end:
|
|
225
|
-
|
|
261
|
+
relative = workspace_relative(target)
|
|
262
|
+
return {
|
|
263
|
+
"ok": False,
|
|
264
|
+
"error_message": "start_line must be <= end_line",
|
|
265
|
+
"path": relative,
|
|
266
|
+
"requested_range": {"start": start, "end": end_line},
|
|
267
|
+
"total_lines": total_lines,
|
|
268
|
+
"suggested_action": (
|
|
269
|
+
f"Re-read the current file with read_workspace_file(path={relative!r}, "
|
|
270
|
+
f"start_line={max(1, min(start, total_lines))}) before editing."
|
|
271
|
+
),
|
|
272
|
+
}
|
|
226
273
|
selected = lines[start - 1 : end] if total_lines else []
|
|
227
274
|
content = "\n".join(
|
|
228
275
|
f"{line_no} | {line}" if include_line_numbers else line
|
|
229
276
|
for line_no, line in enumerate(selected, start=start)
|
|
230
277
|
)
|
|
231
278
|
limit = max(1000, min(int(max_chars or 20000), 100000))
|
|
279
|
+
output_budget = default_tool_result_budget(
|
|
280
|
+
max_chars=limit, preview_chars=limit, persist_threshold_chars=limit
|
|
281
|
+
)
|
|
282
|
+
source_budget = current_source_read_budget()
|
|
283
|
+
if source_budget is not None:
|
|
284
|
+
try:
|
|
285
|
+
limit = source_budget.character_limit(content, limit)
|
|
286
|
+
except ValueError as error:
|
|
287
|
+
code = str(error)
|
|
288
|
+
if code not in {"source_read_budget_unavailable", "source_read_counter_invalid"}:
|
|
289
|
+
code = "source_read_counter_invalid"
|
|
290
|
+
if code == "source_read_budget_unavailable" and source_budget.artifact_only_fallback:
|
|
291
|
+
limit = 1
|
|
292
|
+
else:
|
|
293
|
+
return {"ok": False, "error_message": code, "path": workspace_relative(target)}
|
|
294
|
+
# An environment default must not enlarge the authenticated host's
|
|
295
|
+
# source allowance. Page generation and edit read-state use this same
|
|
296
|
+
# limit, before the result becomes a durable tool receipt.
|
|
297
|
+
output_budget = replace(
|
|
298
|
+
output_budget,
|
|
299
|
+
max_chars=min(output_budget.max_chars, limit),
|
|
300
|
+
preview_chars=min(output_budget.preview_chars, limit),
|
|
301
|
+
persist_threshold_chars=min(output_budget.persist_threshold_chars, limit),
|
|
302
|
+
)
|
|
232
303
|
relative = workspace_relative(target)
|
|
233
304
|
budgeted = budget_tool_output(
|
|
234
305
|
tool_name="read_workspace_file",
|
|
235
306
|
field_name="content",
|
|
236
307
|
value=content,
|
|
237
|
-
metadata={
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
308
|
+
metadata={
|
|
309
|
+
"tool_use_id": (
|
|
310
|
+
f"read_{relative.replace('/', '_')}_{hashlib.sha256(content.encode()).hexdigest()}"
|
|
311
|
+
)
|
|
312
|
+
},
|
|
313
|
+
budget=output_budget,
|
|
241
314
|
)
|
|
242
315
|
partial = start != 1 or end != total_lines
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
316
|
+
returned_end, returned_count = end, len(selected)
|
|
317
|
+
window = {}
|
|
318
|
+
if budgeted["truncated"]:
|
|
319
|
+
preview = budgeted["content"]
|
|
320
|
+
# File reads are continuous source pages. A character-bound prefix
|
|
321
|
+
# must not advertise the requested range as if all lines were visible.
|
|
322
|
+
complete = bool(preview) and content[len(preview) : len(preview) + 1] == "\n"
|
|
323
|
+
boundary = preview.rfind("\n")
|
|
324
|
+
returned_count = (
|
|
325
|
+
preview.count("\n") + 1
|
|
326
|
+
if complete
|
|
327
|
+
else preview[:boundary].count("\n") + 1 if boundary >= 0 else 0
|
|
252
328
|
)
|
|
253
|
-
|
|
254
|
-
|
|
329
|
+
visible = preview if complete or not returned_count else preview[:boundary]
|
|
330
|
+
returned_end = start + returned_count - 1 if returned_count else None
|
|
331
|
+
budgeted.update(content=visible, preview_chars=len(visible))
|
|
332
|
+
window = {
|
|
333
|
+
"source_read_range": {"start": start, "end": end},
|
|
334
|
+
"next_start_line": returned_end + 1 if returned_count else None,
|
|
335
|
+
"suggested_action": (
|
|
336
|
+
f"Continue with read_workspace_file(path={relative!r}, "
|
|
337
|
+
f"start_line={returned_end + 1}); the remaining lines were not returned."
|
|
338
|
+
if returned_count
|
|
339
|
+
else "A source line exceeds the output window. Use bound search or another "
|
|
340
|
+
"permitted inspection tool; the unread remainder cannot be skipped."
|
|
341
|
+
),
|
|
342
|
+
**({"partial_line": start} if not returned_count else {}),
|
|
343
|
+
}
|
|
344
|
+
result = {
|
|
255
345
|
"ok": True,
|
|
256
346
|
"path": relative,
|
|
257
347
|
"size": stat.st_size,
|
|
258
348
|
"size_bytes": stat.st_size,
|
|
259
349
|
"mtime_ns": stat.st_mtime_ns,
|
|
260
350
|
"start_line": start,
|
|
261
|
-
"end_line":
|
|
262
|
-
"line_count":
|
|
263
|
-
"read_range": {"start": start, "end":
|
|
351
|
+
"end_line": returned_end,
|
|
352
|
+
"line_count": returned_count,
|
|
353
|
+
"read_range": {"start": start, "end": returned_end} if returned_end is not None else None,
|
|
264
354
|
"total_lines": total_lines,
|
|
265
355
|
"suggested_action": "",
|
|
266
356
|
"partial": partial or bool(budgeted.get("truncated")),
|
|
357
|
+
**({"source_output_budget": {
|
|
358
|
+
"version": "host-source-page/v2",
|
|
359
|
+
"counter_id": source_budget.counter_id,
|
|
360
|
+
"max_units": source_budget.max_units,
|
|
361
|
+
"max_result_units": source_budget.max_result_units,
|
|
362
|
+
}} if source_budget is not None else {}),
|
|
267
363
|
**budgeted,
|
|
364
|
+
**window,
|
|
268
365
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
366
|
+
if source_budget is not None and source_budget.retain_requested_source:
|
|
367
|
+
# Capture these exact already-read bytes, never a later path re-read.
|
|
368
|
+
# This carrier is audit data, not proof the model inspected the range.
|
|
369
|
+
result["requested_source"] = {
|
|
370
|
+
"path": relative, "read_range": {"start": start, "end": end}, "content": content,
|
|
371
|
+
}
|
|
372
|
+
if source_budget is not None and not source_budget.result_fits(result):
|
|
373
|
+
# Persist the original selected source once. Fit complete continuous
|
|
374
|
+
# lines using the complete JSON reply, before recording edit read-state.
|
|
375
|
+
if not content:
|
|
376
|
+
return {"ok": False, "path": relative,
|
|
377
|
+
"error_message": "source_read_envelope_over_budget"}
|
|
378
|
+
source_lines = content.split("\n")
|
|
379
|
+
persisted = budget_tool_output(
|
|
380
|
+
tool_name="read_workspace_file", field_name="content", value=content,
|
|
381
|
+
metadata={"tool_use_id": (
|
|
382
|
+
f"read_{relative.replace('/', '_')}_{hashlib.sha256(content.encode()).hexdigest()}"
|
|
383
|
+
)}, budget=replace(output_budget, persist_threshold_chars=0),
|
|
384
|
+
)["persisted"]
|
|
385
|
+
|
|
386
|
+
def candidate(count):
|
|
387
|
+
visible = "\n".join(source_lines[:count])
|
|
388
|
+
last = start + count - 1 if count else None
|
|
389
|
+
page = {
|
|
390
|
+
**result, "content": visible, "preview_chars": len(visible),
|
|
391
|
+
"truncated": True, "persisted": persisted, "partial": True,
|
|
392
|
+
"end_line": last, "line_count": count,
|
|
393
|
+
"read_range": {"start": start, "end": last} if last is not None else None,
|
|
394
|
+
"source_read_range": {"start": start, "end": end},
|
|
395
|
+
"next_start_line": last + 1 if last is not None else None,
|
|
396
|
+
"suggested_action": (
|
|
397
|
+
f"Continue with read_workspace_file(path={relative!r}, start_line={last + 1}); "
|
|
398
|
+
"the remaining lines were not returned."
|
|
399
|
+
if last is not None else
|
|
400
|
+
"The source line or result metadata exceeds the output window. "
|
|
401
|
+
"Use bound search or another permitted inspection tool; "
|
|
402
|
+
"the unread remainder cannot be skipped."
|
|
403
|
+
),
|
|
404
|
+
**({"partial_line": start} if not count else {}),
|
|
405
|
+
}
|
|
406
|
+
if not count and source_budget.artifact_only_fallback:
|
|
407
|
+
page["artifact_only"] = True
|
|
408
|
+
return page
|
|
409
|
+
|
|
410
|
+
low, high = 0, returned_count
|
|
411
|
+
if returned_count and source_budget.result_fits(candidate(1)):
|
|
412
|
+
low = 1
|
|
413
|
+
else:
|
|
414
|
+
high = 0
|
|
415
|
+
if not source_budget.result_fits(candidate(0)):
|
|
416
|
+
return {"ok": False, "path": relative,
|
|
417
|
+
"error_message": "source_read_envelope_over_budget"}
|
|
418
|
+
while low < high:
|
|
419
|
+
middle = (low + high + 1) // 2
|
|
420
|
+
if source_budget.result_fits(candidate(middle)):
|
|
421
|
+
low = middle
|
|
422
|
+
else:
|
|
423
|
+
high = middle - 1
|
|
424
|
+
result = candidate(low)
|
|
425
|
+
returned_end = result["end_line"]
|
|
426
|
+
if source_budget is not None and content and not result["content"] and not result["line_count"]:
|
|
427
|
+
# A fitting envelope with no source is not a successful read. Do not
|
|
428
|
+
# record it as a read/edit precondition or let an empty page look like
|
|
429
|
+
# evidence that the requested range contained no relevant facts.
|
|
430
|
+
if not result.get("artifact_only"):
|
|
431
|
+
return {"ok": False, "path": relative,
|
|
432
|
+
"error_message": "source_read_envelope_over_budget"}
|
|
433
|
+
if source_budget is not None and source_budget.artifact_only_fallback and content:
|
|
434
|
+
if not result["line_count"]:
|
|
435
|
+
result.update(artifact_only=True, content="", preview_chars=0)
|
|
436
|
+
if not source_budget.result_fits(result):
|
|
437
|
+
return {"ok": False, "path": relative,
|
|
438
|
+
"error_message": "source_read_envelope_over_budget"}
|
|
439
|
+
# Saving an unread source does not satisfy the live edit precondition.
|
|
440
|
+
return result
|
|
441
|
+
record_read_state(
|
|
442
|
+
WorkspaceReadState(
|
|
443
|
+
path=relative,
|
|
444
|
+
mtime_ns=stat.st_mtime_ns,
|
|
445
|
+
size_bytes=stat.st_size,
|
|
446
|
+
start_line=start,
|
|
447
|
+
end_line=returned_end if returned_end is not None else start,
|
|
448
|
+
total_lines=total_lines,
|
|
449
|
+
partial=result["partial"],
|
|
450
|
+
canonical_path=str(target.resolve()),
|
|
451
|
+
content_sha256=hashlib.sha256(payload).hexdigest(),
|
|
452
|
+
)
|
|
453
|
+
)
|
|
454
|
+
return result
|
|
280
455
|
|
|
281
456
|
|
|
282
457
|
def write_workspace_file(
|
|
@@ -285,7 +460,12 @@ def write_workspace_file(
|
|
|
285
460
|
overwrite: bool = True,
|
|
286
461
|
approval: dict[str, Any] | None = None,
|
|
287
462
|
) -> dict[str, Any]:
|
|
288
|
-
"""Write a UTF-8 text file inside the AgentEngine workspace.
|
|
463
|
+
"""Write a UTF-8 text file inside the AgentEngine workspace.
|
|
464
|
+
|
|
465
|
+
Creating a new file needs no prior read. Replacing an existing file requires
|
|
466
|
+
a complete current read or a successful write/edit in this Session. A
|
|
467
|
+
successful write records the new revision for subsequent changes.
|
|
468
|
+
"""
|
|
289
469
|
|
|
290
470
|
return _dict_result(
|
|
291
471
|
_gateway().invoke(
|
|
@@ -300,17 +480,70 @@ def write_workspace_file(
|
|
|
300
480
|
)
|
|
301
481
|
|
|
302
482
|
|
|
303
|
-
def
|
|
483
|
+
def _workspace_write_precondition(
|
|
484
|
+
path: str, *, overwrite: bool
|
|
485
|
+
) -> tuple[Path, str, dict[str, Any] | None]:
|
|
304
486
|
target = resolve_workspace_path(path)
|
|
305
|
-
|
|
306
|
-
if target.exists()
|
|
307
|
-
return
|
|
308
|
-
|
|
487
|
+
relative = workspace_relative(target)
|
|
488
|
+
if not target.exists():
|
|
489
|
+
return target, relative, None
|
|
490
|
+
if not overwrite:
|
|
491
|
+
return target, relative, {
|
|
492
|
+
"ok": False,
|
|
493
|
+
"path": relative,
|
|
494
|
+
"error_type": "file_exists",
|
|
495
|
+
"error_message": f"workspace file already exists: {path}",
|
|
496
|
+
}
|
|
497
|
+
current, error = _read_workspace_text(target)
|
|
498
|
+
if error is not None:
|
|
499
|
+
return target, relative, {**error, "path": relative}
|
|
500
|
+
state = get_read_state(relative)
|
|
501
|
+
if state is not None and state.partial:
|
|
502
|
+
return target, relative, {
|
|
503
|
+
"ok": False,
|
|
504
|
+
"path": relative,
|
|
505
|
+
"error_type": "file_not_fully_read",
|
|
506
|
+
"error_message": "existing file must be read completely before overwriting",
|
|
507
|
+
"suggested_action": (
|
|
508
|
+
f"Call read_workspace_file(path={relative!r}) without a line range, then retry."
|
|
509
|
+
),
|
|
510
|
+
}
|
|
511
|
+
validation = _validate_read_state(target, relative, state=state, content=current)
|
|
512
|
+
if validation is not None:
|
|
513
|
+
if validation.get("error_type") == "file_not_read":
|
|
514
|
+
validation = {
|
|
515
|
+
**validation,
|
|
516
|
+
"error_message": "existing file must be read before overwriting",
|
|
517
|
+
"suggested_action": (
|
|
518
|
+
f"Call read_workspace_file(path={relative!r}) before overwriting it."
|
|
519
|
+
),
|
|
520
|
+
}
|
|
521
|
+
return target, relative, validation
|
|
522
|
+
return target, relative, None
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
@_workspace_file_guard
|
|
526
|
+
def _write_workspace_file_impl(path: str, content: str, overwrite: bool = True) -> dict[str, Any]:
|
|
527
|
+
create_only = not resolve_workspace_path(path).exists()
|
|
528
|
+
target, relative, error = _workspace_write_precondition(path, overwrite=overwrite)
|
|
529
|
+
if error is not None:
|
|
530
|
+
return error
|
|
531
|
+
written = content or ""
|
|
532
|
+
try:
|
|
533
|
+
publish_workspace_bytes(target, written.encode("utf-8"), create_only=create_only)
|
|
534
|
+
except FileExistsError:
|
|
535
|
+
return {"ok": False, "path": relative, "error_type": "file_exists",
|
|
536
|
+
"error_message": "workspace file was created before publication",
|
|
537
|
+
"suggested_action": "Read the new file before proposing an overwrite."}
|
|
538
|
+
stat = target.stat()
|
|
539
|
+
# The successfully written bytes are an observed revision, just as an
|
|
540
|
+
# edit's result is. A subsequent edit still validates the actual file.
|
|
541
|
+
_refresh_read_state(relative, stat, written, target=target)
|
|
309
542
|
return {
|
|
310
543
|
"ok": True,
|
|
311
|
-
"path":
|
|
544
|
+
"path": relative,
|
|
312
545
|
"absolute_path": str(target),
|
|
313
|
-
"size":
|
|
546
|
+
"size": stat.st_size,
|
|
314
547
|
}
|
|
315
548
|
|
|
316
549
|
|
|
@@ -319,7 +552,11 @@ def write_workspace_files(
|
|
|
319
552
|
overwrite: bool = True,
|
|
320
553
|
approval: dict[str, Any] | None = None,
|
|
321
554
|
) -> dict[str, Any]:
|
|
322
|
-
"""Write multiple UTF-8 text files inside the AgentEngine workspace.
|
|
555
|
+
"""Write multiple UTF-8 text files inside the AgentEngine workspace.
|
|
556
|
+
|
|
557
|
+
Existing files must already have complete current revisions. Preconditions
|
|
558
|
+
for the admitted batch are checked before the first file is changed.
|
|
559
|
+
"""
|
|
323
560
|
|
|
324
561
|
return _dict_result(
|
|
325
562
|
_gateway().invoke(
|
|
@@ -338,20 +575,26 @@ def _write_workspace_files_impl(
|
|
|
338
575
|
) -> dict[str, Any]:
|
|
339
576
|
if not isinstance(files, list) or not files:
|
|
340
577
|
return {"ok": False, "error_message": "files must be a non-empty list"}
|
|
341
|
-
|
|
578
|
+
prepared: list[tuple[str, str]] = []
|
|
342
579
|
for item in files[:100]:
|
|
343
580
|
if not isinstance(item, dict):
|
|
344
581
|
return {"ok": False, "error_message": "each file item must be an object"}
|
|
345
582
|
path = str(item.get("path") or "").strip()
|
|
346
583
|
if not path:
|
|
347
584
|
return {"ok": False, "error_message": "each file item requires path"}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
585
|
+
prepared.append((path, str(item.get("content") or "")))
|
|
586
|
+
with locked_workspace_paths(resolve_workspace_path(path) for path, _ in prepared):
|
|
587
|
+
for path, _ in prepared:
|
|
588
|
+
_target, _relative, error = _workspace_write_precondition(path, overwrite=overwrite)
|
|
589
|
+
if error is not None:
|
|
590
|
+
return error
|
|
591
|
+
written = []
|
|
592
|
+
for path, content in prepared:
|
|
593
|
+
result = _write_workspace_file_impl(path, content, overwrite=overwrite)
|
|
594
|
+
if not result.get("ok"):
|
|
595
|
+
return result
|
|
596
|
+
written.append({"path": result["path"], "size": result["size"]})
|
|
597
|
+
return {"ok": True, "written": written, "truncated": len(files) > len(written)}
|
|
355
598
|
|
|
356
599
|
|
|
357
600
|
def edit_workspace_file(
|
|
@@ -362,9 +605,9 @@ def edit_workspace_file(
|
|
|
362
605
|
replace_all: bool = False,
|
|
363
606
|
approval: dict[str, Any] | None = None,
|
|
364
607
|
) -> dict[str, Any]:
|
|
365
|
-
"""Replace exact text after reading
|
|
608
|
+
"""Replace exact text after reading or successfully writing the file.
|
|
366
609
|
|
|
367
|
-
The
|
|
610
|
+
The prior operation must complete; do not batch dependent reads/writes and edits.
|
|
368
611
|
"""
|
|
369
612
|
|
|
370
613
|
return _dict_result(
|
|
@@ -382,6 +625,7 @@ def edit_workspace_file(
|
|
|
382
625
|
)
|
|
383
626
|
|
|
384
627
|
|
|
628
|
+
@_workspace_file_guard
|
|
385
629
|
def _edit_workspace_file_impl(
|
|
386
630
|
path: str,
|
|
387
631
|
old_text: str,
|
|
@@ -394,7 +638,11 @@ def _edit_workspace_file_impl(
|
|
|
394
638
|
request_error = _validate_single_edit_request(old_text, relative=relative)
|
|
395
639
|
if request_error is not None:
|
|
396
640
|
return request_error
|
|
397
|
-
|
|
641
|
+
observed = get_read_state(relative)
|
|
642
|
+
# Pin this edit to its admitted read even if another call refreshes the
|
|
643
|
+
# session's cache while matching or producing the diff.
|
|
644
|
+
observed = replace(observed) if observed is not None else None
|
|
645
|
+
read_error = _validate_read_state(target, relative, state=observed)
|
|
398
646
|
if read_error is not None:
|
|
399
647
|
return read_error
|
|
400
648
|
text, error = _read_workspace_text(target)
|
|
@@ -402,6 +650,9 @@ def _edit_workspace_file_impl(
|
|
|
402
650
|
return {**error, "path": path}
|
|
403
651
|
if text is None:
|
|
404
652
|
return {"ok": False, "path": path, "error_message": "workspace file read failed"}
|
|
653
|
+
read_error = _validate_read_state(target, relative, state=observed, content=text)
|
|
654
|
+
if read_error is not None:
|
|
655
|
+
return read_error
|
|
405
656
|
edit_result = _apply_single_edit(
|
|
406
657
|
text,
|
|
407
658
|
old_text,
|
|
@@ -414,10 +665,10 @@ def _edit_workspace_file_impl(
|
|
|
414
665
|
return edit_result
|
|
415
666
|
updated = str(edit_result["updated"])
|
|
416
667
|
diff = _build_diff(relative, text, updated)
|
|
417
|
-
target.write_text(updated, encoding="utf-8")
|
|
418
|
-
new_stat = target.stat()
|
|
419
|
-
_refresh_read_state(relative, new_stat, updated)
|
|
420
668
|
diff_budget = _budget_diff("edit_workspace_file", diff, relative)
|
|
669
|
+
new_stat, error = _commit_workspace_edit(target, relative, updated, state=observed)
|
|
670
|
+
if error is not None:
|
|
671
|
+
return error
|
|
421
672
|
return {
|
|
422
673
|
"ok": True,
|
|
423
674
|
"path": relative,
|
|
@@ -436,9 +687,9 @@ def multi_edit_workspace_file(
|
|
|
436
687
|
replace_all: bool = False,
|
|
437
688
|
approval: dict[str, Any] | None = None,
|
|
438
689
|
) -> dict[str, Any]:
|
|
439
|
-
"""Apply atomic exact edits after reading
|
|
690
|
+
"""Apply atomic exact edits after reading or successfully writing the file.
|
|
440
691
|
|
|
441
|
-
The
|
|
692
|
+
The prior operation must complete; do not batch dependent reads/writes and edits.
|
|
442
693
|
"""
|
|
443
694
|
|
|
444
695
|
return _dict_result(
|
|
@@ -454,6 +705,7 @@ def multi_edit_workspace_file(
|
|
|
454
705
|
)
|
|
455
706
|
|
|
456
707
|
|
|
708
|
+
@_workspace_file_guard
|
|
457
709
|
def _multi_edit_workspace_file_impl(
|
|
458
710
|
path: str,
|
|
459
711
|
edits: list[dict[str, Any]],
|
|
@@ -480,13 +732,18 @@ def _multi_edit_workspace_file_impl(
|
|
|
480
732
|
request_error = _validate_single_edit_request(edit.get("old_text"), relative=relative)
|
|
481
733
|
if request_error is not None:
|
|
482
734
|
return {**request_error, "failed_edit_index": index, "edit_count": len(edits)}
|
|
483
|
-
|
|
735
|
+
observed = get_read_state(relative)
|
|
736
|
+
observed = replace(observed) if observed is not None else None
|
|
737
|
+
read_error = _validate_read_state(target, relative, state=observed)
|
|
484
738
|
if read_error is not None:
|
|
485
739
|
return read_error
|
|
486
740
|
text, error = _read_workspace_text(target)
|
|
487
741
|
if error is not None:
|
|
488
742
|
return {**error, "path": path}
|
|
489
743
|
original = text or ""
|
|
744
|
+
read_error = _validate_read_state(target, relative, state=observed, content=original)
|
|
745
|
+
if read_error is not None:
|
|
746
|
+
return read_error
|
|
490
747
|
updated = original
|
|
491
748
|
diagnostics: list[dict[str, Any]] = []
|
|
492
749
|
total_replacements = 0
|
|
@@ -512,10 +769,10 @@ def _multi_edit_workspace_file_impl(
|
|
|
512
769
|
}
|
|
513
770
|
)
|
|
514
771
|
diff = _build_diff(relative, original, updated)
|
|
515
|
-
target.write_text(updated, encoding="utf-8")
|
|
516
|
-
new_stat = target.stat()
|
|
517
|
-
_refresh_read_state(relative, new_stat, updated)
|
|
518
772
|
diff_budget = _budget_diff("multi_edit_workspace_file", diff, relative)
|
|
773
|
+
new_stat, error = _commit_workspace_edit(target, relative, updated, state=observed)
|
|
774
|
+
if error is not None:
|
|
775
|
+
return error
|
|
519
776
|
return {
|
|
520
777
|
"ok": True,
|
|
521
778
|
"path": relative,
|
|
@@ -657,11 +914,16 @@ def _search_workspace_files_impl(
|
|
|
657
914
|
if not needle:
|
|
658
915
|
return {"ok": False, "error_message": "query is required"}
|
|
659
916
|
base = resolve_workspace_path(path)
|
|
660
|
-
if
|
|
917
|
+
if not base.exists():
|
|
918
|
+
return {"ok": False, "error_code": "workspace_path_not_found",
|
|
919
|
+
"error_message": f"workspace path not found: {path}"}
|
|
920
|
+
if shutil.which("rg"):
|
|
661
921
|
rg_result = _search_with_rg(
|
|
662
922
|
needle, base, is_regex, glob, case_sensitive, context_lines, max_results
|
|
663
923
|
)
|
|
664
924
|
if rg_result is not None:
|
|
925
|
+
if not rg_result["ok"]:
|
|
926
|
+
return rg_result
|
|
665
927
|
return _search_payload(
|
|
666
928
|
query, path, rg_result["results"], rg_result["truncated"], context_lines, "rg"
|
|
667
929
|
)
|
|
@@ -673,7 +935,11 @@ def _search_workspace_files_impl(
|
|
|
673
935
|
if fnmatch.fnmatch(workspace_relative(item), glob) or fnmatch.fnmatch(item.name, glob)
|
|
674
936
|
]
|
|
675
937
|
flags = 0 if case_sensitive else re.IGNORECASE
|
|
676
|
-
|
|
938
|
+
try:
|
|
939
|
+
pattern = re.compile(needle if is_regex else re.escape(needle), flags)
|
|
940
|
+
except re.error as error:
|
|
941
|
+
return {"ok": False, "error_code": "invalid_search_pattern",
|
|
942
|
+
"error_message": str(error)}
|
|
677
943
|
results: list[dict[str, Any]] = []
|
|
678
944
|
limit = max(1, min(int(max_results or 100), 5000))
|
|
679
945
|
context_limit = max(0, min(int(context_lines or 0), 20))
|
|
@@ -731,263 +997,14 @@ def _search_with_rg(
|
|
|
731
997
|
context_lines: int,
|
|
732
998
|
max_results: int,
|
|
733
999
|
) -> dict[str, Any] | None:
|
|
734
|
-
|
|
735
|
-
if not is_regex:
|
|
736
|
-
command.append("--fixed-strings")
|
|
737
|
-
if not case_sensitive:
|
|
738
|
-
command.append("--ignore-case")
|
|
739
|
-
if glob:
|
|
740
|
-
command.extend(["--glob", glob])
|
|
741
|
-
if context_lines:
|
|
742
|
-
command.extend(["--context", str(max(0, min(int(context_lines), 20)))])
|
|
743
|
-
command.extend([needle, str(base)])
|
|
744
|
-
try:
|
|
745
|
-
completed = subprocess.run(command, capture_output=True, text=True, timeout=10, check=False)
|
|
746
|
-
except Exception:
|
|
747
|
-
return None
|
|
748
|
-
if completed.returncode not in {0, 1}:
|
|
749
|
-
return None
|
|
750
|
-
results: list[dict[str, Any]] = []
|
|
751
|
-
limit = max(1, min(int(max_results or 100), 5000))
|
|
752
|
-
truncated = False
|
|
753
|
-
for raw_line in completed.stdout.splitlines():
|
|
754
|
-
separator = ":" if ":" in raw_line else "-"
|
|
755
|
-
parts = raw_line.split(separator, 2)
|
|
756
|
-
if len(parts) < 3 or not parts[1].isdigit():
|
|
757
|
-
continue
|
|
758
|
-
path = Path(parts[0])
|
|
759
|
-
try:
|
|
760
|
-
relative = workspace_relative(path)
|
|
761
|
-
except ValueError:
|
|
762
|
-
continue
|
|
763
|
-
if len(results) >= limit:
|
|
764
|
-
truncated = True
|
|
765
|
-
break
|
|
766
|
-
results.append(
|
|
767
|
-
{
|
|
768
|
-
"path": relative,
|
|
769
|
-
"line": int(parts[1]),
|
|
770
|
-
"text": parts[2],
|
|
771
|
-
"snippet": parts[2],
|
|
772
|
-
"context_before": [],
|
|
773
|
-
"context_after": [],
|
|
774
|
-
}
|
|
775
|
-
)
|
|
776
|
-
return {"ok": True, "query": needle, "results": results, "truncated": truncated}
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
def _search_payload(
|
|
780
|
-
query: str,
|
|
781
|
-
path: str,
|
|
782
|
-
results: list[dict[str, Any]],
|
|
783
|
-
truncated: bool,
|
|
784
|
-
context_lines: int,
|
|
785
|
-
backend: str,
|
|
786
|
-
) -> dict[str, Any]:
|
|
787
|
-
return {
|
|
788
|
-
"ok": True,
|
|
789
|
-
"query": query,
|
|
790
|
-
"searched_path": path,
|
|
791
|
-
"results": results,
|
|
792
|
-
"match_count": len(results),
|
|
793
|
-
"truncated": truncated,
|
|
794
|
-
"context_lines": max(0, min(int(context_lines or 0), 20)),
|
|
795
|
-
"search_backend": backend,
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
def _validate_read_state(target: Path, relative: str) -> dict[str, Any] | None:
|
|
800
|
-
read_state = get_read_state(relative)
|
|
801
|
-
if read_state is None:
|
|
802
|
-
return {
|
|
803
|
-
"ok": False,
|
|
804
|
-
"path": relative,
|
|
805
|
-
"error_type": "file_not_read",
|
|
806
|
-
"error_message": "file must be read before editing",
|
|
807
|
-
"suggested_action": f"Call read_workspace_file(path={relative!r}) before editing.",
|
|
808
|
-
}
|
|
809
|
-
stat = target.stat() if target.exists() else None
|
|
810
|
-
if (
|
|
811
|
-
stat is None
|
|
812
|
-
or stat.st_mtime_ns != read_state.mtime_ns
|
|
813
|
-
or stat.st_size != read_state.size_bytes
|
|
814
|
-
):
|
|
815
|
-
return {
|
|
816
|
-
"ok": False,
|
|
817
|
-
"path": relative,
|
|
818
|
-
"error_type": "file_modified_since_read",
|
|
819
|
-
"error_message": "workspace file changed since last read",
|
|
820
|
-
"suggested_action": (
|
|
821
|
-
f"Re-read the file with read_workspace_file(path={relative!r}) " "and retry."
|
|
822
|
-
),
|
|
823
|
-
}
|
|
824
|
-
return None
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
def _apply_single_edit(
|
|
828
|
-
text: str,
|
|
829
|
-
old_text: Any,
|
|
830
|
-
new_text: Any,
|
|
831
|
-
*,
|
|
832
|
-
expected_replacements: int = 1,
|
|
833
|
-
replace_all: bool = False,
|
|
834
|
-
relative: str,
|
|
835
|
-
) -> dict[str, Any]:
|
|
836
|
-
request_error = _validate_single_edit_request(old_text, relative=relative)
|
|
837
|
-
if request_error is not None:
|
|
838
|
-
return request_error
|
|
839
|
-
old = str(old_text)
|
|
840
|
-
expected = max(1, int(expected_replacements or 1))
|
|
841
|
-
actual_old, used_quote_normalization = _find_actual_string(text, old)
|
|
842
|
-
matches = _match_previews(text, actual_old or old) if actual_old else []
|
|
843
|
-
occurrences = text.count(actual_old) if actual_old else 0
|
|
844
|
-
if occurrences == 0:
|
|
845
|
-
return {
|
|
846
|
-
"ok": False,
|
|
847
|
-
"path": relative,
|
|
848
|
-
"error_type": "snippet_not_found",
|
|
849
|
-
"error_message": "old_text was not found in the workspace file",
|
|
850
|
-
"occurrences": 0,
|
|
851
|
-
"nearby_candidates": _nearby_candidates(text, old),
|
|
852
|
-
"suggested_action": (
|
|
853
|
-
"Use one nearby candidate as old_text, or call read_workspace_file "
|
|
854
|
-
"with line numbers and retry."
|
|
855
|
-
),
|
|
856
|
-
}
|
|
857
|
-
if actual_old is None:
|
|
858
|
-
return {
|
|
859
|
-
"ok": False,
|
|
860
|
-
"path": relative,
|
|
861
|
-
"error_type": "snippet_not_found",
|
|
862
|
-
"error_message": "old_text was not found in the workspace file",
|
|
863
|
-
}
|
|
864
|
-
if not replace_all and occurrences != expected:
|
|
865
|
-
return {
|
|
866
|
-
"ok": False,
|
|
867
|
-
"path": relative,
|
|
868
|
-
"error_type": "ambiguous_edit",
|
|
869
|
-
"error_message": f"old_text matched {occurrences} occurrences, expected {expected}",
|
|
870
|
-
"occurrences": occurrences,
|
|
871
|
-
"expected_replacements": expected,
|
|
872
|
-
"matches": matches,
|
|
873
|
-
"suggested_action": (
|
|
874
|
-
"Provide a larger unique old_text snippet, set expected_replacements, "
|
|
875
|
-
"or use replace_all=true."
|
|
876
|
-
),
|
|
877
|
-
}
|
|
878
|
-
replacements = occurrences if replace_all else expected
|
|
879
|
-
return {
|
|
880
|
-
"ok": True,
|
|
881
|
-
"updated": text.replace(actual_old, str(new_text or ""), replacements),
|
|
882
|
-
"replacements": replacements,
|
|
883
|
-
"used_quote_normalization": used_quote_normalization,
|
|
884
|
-
"matches": matches,
|
|
885
|
-
}
|
|
886
|
-
|
|
1000
|
+
from ksadk.toolsets.workspace_search import search_with_rg
|
|
887
1001
|
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
"ok": False,
|
|
892
|
-
"path": relative,
|
|
893
|
-
"error_type": "missing_old_text",
|
|
894
|
-
"error_message": "old_text is required",
|
|
895
|
-
}
|
|
896
|
-
return None
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
def _match_previews(text: str, needle: str, limit: int = 20) -> list[dict[str, Any]]:
|
|
900
|
-
if not needle:
|
|
901
|
-
return []
|
|
902
|
-
matches: list[dict[str, Any]] = []
|
|
903
|
-
for line_no, line in enumerate(text.splitlines(), start=1):
|
|
904
|
-
if needle in line:
|
|
905
|
-
matches.append({"line": line_no, "text": line.strip(), "snippet": line})
|
|
906
|
-
if len(matches) >= limit:
|
|
907
|
-
break
|
|
908
|
-
return matches
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
def _nearby_candidates(text: str, old: str, limit: int = 5) -> list[dict[str, Any]]:
|
|
912
|
-
old_norm = _normalize_quotes(old).strip()
|
|
913
|
-
candidates: list[dict[str, Any]] = []
|
|
914
|
-
for line_no, line in enumerate(text.splitlines(), start=1):
|
|
915
|
-
ratio = difflib.SequenceMatcher(None, old_norm, _normalize_quotes(line).strip()).ratio()
|
|
916
|
-
if old_norm and (
|
|
917
|
-
old_norm[: max(1, min(4, len(old_norm)))] in _normalize_quotes(line) or ratio > 0.45
|
|
918
|
-
):
|
|
919
|
-
candidates.append(
|
|
920
|
-
{"line": line_no, "text": line.strip(), "snippet": line, "score": round(ratio, 3)}
|
|
921
|
-
)
|
|
922
|
-
candidates.sort(key=lambda item: (-float(item["score"]), int(item["line"])))
|
|
923
|
-
return candidates[:limit]
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
def _build_diff(relative: str, before: str, after: str) -> str:
|
|
927
|
-
return "".join(
|
|
928
|
-
difflib.unified_diff(
|
|
929
|
-
before.splitlines(keepends=True),
|
|
930
|
-
after.splitlines(keepends=True),
|
|
931
|
-
fromfile=f"{relative} before",
|
|
932
|
-
tofile=f"{relative} after",
|
|
933
|
-
)
|
|
1002
|
+
return search_with_rg(
|
|
1003
|
+
needle, base, is_regex, glob, case_sensitive, context_lines, max_results,
|
|
1004
|
+
relative_path=workspace_relative,
|
|
934
1005
|
)
|
|
935
1006
|
|
|
936
1007
|
|
|
937
|
-
def _budget_diff(tool_name: str, diff: str, relative: str) -> dict[str, Any]:
|
|
938
|
-
return _dict_result(
|
|
939
|
-
budget_tool_output(
|
|
940
|
-
tool_name=tool_name,
|
|
941
|
-
field_name="diff",
|
|
942
|
-
value=diff,
|
|
943
|
-
metadata={"tool_use_id": f"{tool_name}_{relative.replace('/', '_')}"},
|
|
944
|
-
),
|
|
945
|
-
tool_name=tool_name,
|
|
946
|
-
)
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
def _refresh_read_state(relative: str, stat: Any, text: str) -> None:
|
|
950
|
-
lines = text.splitlines()
|
|
951
|
-
record_read_state(
|
|
952
|
-
WorkspaceReadState(
|
|
953
|
-
path=relative,
|
|
954
|
-
mtime_ns=stat.st_mtime_ns,
|
|
955
|
-
size_bytes=stat.st_size,
|
|
956
|
-
start_line=1,
|
|
957
|
-
end_line=len(lines),
|
|
958
|
-
total_lines=len(lines),
|
|
959
|
-
partial=False,
|
|
960
|
-
)
|
|
961
|
-
)
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
def _find_actual_string(text: str, old: str) -> tuple[str | None, bool]:
|
|
965
|
-
if old in text:
|
|
966
|
-
return old, False
|
|
967
|
-
normalized_old = _normalize_quotes(old)
|
|
968
|
-
smart_quote_map: dict[str, str | int | None] = {'"': "“", "'": "‘"}
|
|
969
|
-
for candidate in {normalized_old, old.translate(str.maketrans(smart_quote_map))}:
|
|
970
|
-
if candidate and candidate in text:
|
|
971
|
-
return candidate, True
|
|
972
|
-
normalized_text = _normalize_quotes(text)
|
|
973
|
-
index = normalized_text.find(normalized_old)
|
|
974
|
-
if index < 0:
|
|
975
|
-
return None, False
|
|
976
|
-
return text[index : index + len(old)], True
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
def _normalize_quotes(value: str) -> str:
|
|
980
|
-
quote_map: dict[str, str | int | None] = {
|
|
981
|
-
"“": '"',
|
|
982
|
-
"”": '"',
|
|
983
|
-
"„": '"',
|
|
984
|
-
"‘": "'",
|
|
985
|
-
"’": "'",
|
|
986
|
-
"‚": "'",
|
|
987
|
-
}
|
|
988
|
-
return value.translate(str.maketrans(quote_map))
|
|
989
|
-
|
|
990
|
-
|
|
991
1008
|
def delete_workspace_file(path: str, approval: dict[str, Any] | None = None) -> dict[str, Any]:
|
|
992
1009
|
"""Delete a file or empty directory inside the AgentEngine workspace."""
|
|
993
1010
|
|
|
@@ -999,6 +1016,7 @@ def delete_workspace_file(path: str, approval: dict[str, Any] | None = None) ->
|
|
|
999
1016
|
)
|
|
1000
1017
|
|
|
1001
1018
|
|
|
1019
|
+
@_workspace_file_guard
|
|
1002
1020
|
def _delete_workspace_file_impl(path: str) -> dict[str, Any]:
|
|
1003
1021
|
target = resolve_workspace_path(path)
|
|
1004
1022
|
root = workspace_root().resolve()
|