agentengine-sdk-python 0.8.0__py3-none-any.whl → 0.8.2__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.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
- agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
- ksadk/a2a/__init__.py +2 -0
- ksadk/a2a/_space_client_events.py +381 -0
- ksadk/a2a/bootstrap.py +0 -2
- ksadk/a2a/card.py +6 -111
- ksadk/a2a/control_plane.py +239 -1
- ksadk/a2a/event_adapter.py +156 -64
- ksadk/a2a/executor.py +195 -172
- ksadk/a2a/routes.py +12 -5
- ksadk/a2a/server.py +1 -8
- ksadk/a2a/service_env.py +33 -0
- ksadk/a2a/space_client.py +43 -349
- ksadk/a2a_card.py +101 -0
- ksadk/a2ui/core.py +222 -53
- ksadk/agui/_agent_helpers.py +243 -0
- ksadk/agui/a2ui_projection.py +12 -5
- ksadk/agui/agent.py +474 -275
- ksadk/agui/config.py +11 -5
- ksadk/agui/routes.py +7 -15
- ksadk/api/client.py +530 -40
- ksadk/api/environment.py +27 -0
- ksadk/builders/code_builder.py +352 -53
- ksadk/builders/container_builder.py +71 -44
- ksadk/builders/framework_requirements.py +2 -1
- ksadk/builders/ks3_uploader.py +2 -2
- ksadk/builders/managed_runtime_builder.py +60 -28
- ksadk/cli/__init__.py +25 -0
- ksadk/cli/cmd_a2a.py +18 -31
- ksadk/cli/cmd_create.py +13 -26
- ksadk/cli/cmd_dashboard.py +15 -1
- ksadk/cli/cmd_deploy.py +28 -3
- ksadk/cli/cmd_eval.py +443 -0
- ksadk/cli/cmd_evalset.py +284 -0
- ksadk/cli/cmd_files.py +5 -1
- ksadk/cli/cmd_hermes.py +137 -163
- ksadk/cli/cmd_invoke.py +28 -38
- ksadk/cli/cmd_launch.py +12 -0
- ksadk/cli/cmd_managed_runtime.py +95 -0
- ksadk/cli/cmd_observe.py +85 -0
- ksadk/cli/cmd_openclaw.py +85 -479
- ksadk/cli/cmd_replay.py +28 -4
- ksadk/cli/cmd_run.py +29 -67
- ksadk/cli/cmd_studio.py +201 -0
- ksadk/cli/cmd_web.py +15 -6
- ksadk/cli/dry_run.py +2 -1
- ksadk/cli/env_options.py +83 -0
- ksadk/cli/global_options.py +3 -1
- ksadk/cli/hermes_env.py +151 -0
- ksadk/cli/invoke_payload.py +49 -0
- ksadk/cli/network_options.py +7 -5
- ksadk/cli/openclaw_env.py +458 -0
- ksadk/cli/runtime_bootstrap.py +51 -0
- ksadk/cli/ui.py +6 -0
- ksadk/cli/workflow_common.py +5 -5
- ksadk/codex/__init__.py +3 -3
- ksadk/codex/client.py +833 -49
- ksadk/codex/phase.py +1 -1
- ksadk/codex/runtime.py +720 -127
- ksadk/common/kop_client.py +232 -0
- ksadk/configs/__init__.py +1 -3
- ksadk/configs/env_registry.py +244 -45
- ksadk/configs/env_registry_pcm.py +181 -0
- ksadk/configs/env_var_spec.py +18 -0
- ksadk/configs/global_config.py +6 -1
- ksadk/configs/settings.py +5 -108
- ksadk/context_engine/__init__.py +98 -0
- ksadk/context_engine/assembler.py +176 -0
- ksadk/context_engine/baseline.py +419 -0
- ksadk/context_engine/cache_observability.py +228 -0
- ksadk/context_engine/capabilities.py +443 -0
- ksadk/context_engine/contributors.py +344 -0
- ksadk/context_engine/hosted_pipeline.py +417 -0
- ksadk/context_engine/models.py +117 -0
- ksadk/context_engine/planner.py +698 -0
- ksadk/context_engine/policies.py +319 -0
- ksadk/context_engine/projection.py +31 -0
- ksadk/context_engine/shadow_plan.py +266 -0
- ksadk/context_engine/tokenizer.py +164 -0
- ksadk/conversations/__init__.py +85 -94
- ksadk/conversations/context.py +126 -6
- ksadk/conversations/message_projection.py +292 -28
- ksadk/conversations/model_context.py +49 -3
- ksadk/conversations/runtime_compaction.py +207 -5
- ksadk/conversations/runtime_input.py +193 -3
- ksadk/conversations/runtime_invocation.py +81 -3
- ksadk/conversations/runtime_observability.py +157 -4
- ksadk/conversations/runtime_payloads.py +42 -0
- ksadk/conversations/runtime_preparation.py +280 -2
- ksadk/conversations/runtime_resume.py +71 -32
- ksadk/conversations/runtime_stream_events.py +94 -9
- ksadk/conversations/runtime_streaming.py +175 -22
- ksadk/conversations/semantic_summary.py +311 -1
- ksadk/conversations/session_lock.py +51 -0
- ksadk/deployment/env_forward.py +72 -0
- ksadk/deployment/managed_runtime.py +38 -0
- ksadk/deployment/manager.py +24 -8
- ksadk/deployment/providers/serverless.py +228 -92
- ksadk/evaluation/__init__.py +116 -0
- ksadk/evaluation/a2a_adapter.py +452 -0
- ksadk/evaluation/adapters.py +67 -0
- ksadk/evaluation/agent_eval_client.py +395 -0
- ksadk/evaluation/cloud_binding.py +80 -0
- ksadk/evaluation/cloud_converter.py +194 -0
- ksadk/evaluation/cloud_service.py +199 -0
- ksadk/evaluation/contracts.py +478 -0
- ksadk/evaluation/evalset.py +351 -0
- ksadk/evaluation/evaluators.py +627 -0
- ksadk/evaluation/evidence.py +258 -0
- ksadk/evaluation/executor.py +143 -0
- ksadk/evaluation/local_adapter.py +550 -0
- ksadk/evaluation/service_env.py +27 -0
- ksadk/evaluation/storage.py +68 -0
- ksadk/evaluation/studio_build_adapter.py +253 -0
- ksadk/evaluation/target.py +82 -0
- ksadk/events/__init__.py +13 -13
- ksadk/events/_v1_compat/__init__.py +1 -0
- ksadk/events/_v1_compat/models.py +299 -0
- ksadk/events/_v1_compat/parser.py +247 -0
- ksadk/events/_v1_compat/projection.py +753 -0
- ksadk/events/adapters/__init__.py +34 -0
- ksadk/events/adapters/_a2a_snapshot.py +622 -0
- ksadk/events/adapters/_a2a_support.py +275 -0
- ksadk/events/adapters/_codex_interactions.py +375 -0
- ksadk/events/adapters/_codex_items.py +801 -0
- ksadk/events/adapters/_codex_validators.py +311 -0
- ksadk/events/adapters/_langgraph_support.py +785 -0
- ksadk/events/adapters/a2a.py +841 -0
- ksadk/events/adapters/adk.py +503 -0
- ksadk/events/adapters/codex.py +717 -0
- ksadk/events/adapters/langgraph.py +745 -0
- ksadk/events/canonical.py +440 -0
- ksadk/events/canonical_replay.py +497 -0
- ksadk/events/canonical_store.py +468 -0
- ksadk/events/cold_recovery.py +257 -0
- ksadk/events/content.py +89 -0
- ksadk/events/identity.py +86 -0
- ksadk/events/pipeline.py +455 -0
- ksadk/events/projections.py +66 -0
- ksadk/events/reducer.py +661 -0
- ksadk/events/replay.py +3 -36
- ksadk/events/runtime_event.py +20 -256
- ksadk/events/session_event.py +324 -0
- ksadk/events/store.py +3 -316
- ksadk/events/v1_compat.py +41 -0
- ksadk/harness/__init__.py +3 -2
- ksadk/harness/app.py +114 -123
- ksadk/harness/config.py +1 -1
- ksadk/harness/runtime.py +467 -0
- ksadk/hermes_terminal.py +5 -0
- ksadk/identity/resolver.py +4 -3
- ksadk/interaction/__init__.py +28 -0
- ksadk/interaction/contracts.py +136 -0
- ksadk/interaction/ledger.py +189 -0
- ksadk/interaction/provider.py +122 -0
- ksadk/interaction/providers/__init__.py +52 -0
- ksadk/interaction/providers/adk.py +40 -0
- ksadk/interaction/providers/codex.py +94 -0
- ksadk/interaction/providers/langgraph.py +58 -0
- ksadk/kernel/__init__.py +117 -0
- ksadk/kernel/authorization.py +258 -0
- ksadk/kernel/bootstrap.py +1074 -0
- ksadk/kernel/contract_fingerprints.py +61 -0
- ksadk/kernel/contracts.py +362 -0
- ksadk/kernel/control.py +219 -0
- ksadk/kernel/errors.py +79 -0
- ksadk/kernel/ingress.py +1102 -0
- ksadk/kernel/mapping.py +111 -0
- ksadk/kernel/memory_store.py +1133 -0
- ksadk/kernel/postgres_store.py +1756 -0
- ksadk/kernel/recovery.py +452 -0
- ksadk/kernel/runtime_identity.py +103 -0
- ksadk/kernel/sql/001_agent_kernel.sql +120 -0
- ksadk/kernel/sqlite_store.py +1410 -0
- ksadk/kernel/state.py +145 -0
- ksadk/kernel/store.py +232 -0
- ksadk/kernel/worker.py +953 -0
- ksadk/knowledge_base/client.py +22 -4
- ksadk/knowledge_base/service.py +32 -5
- ksadk/managed_a2a_card.py +160 -0
- ksadk/managed_runtime.py +16 -9
- ksadk/memory/__init__.py +61 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
- ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
- ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
- ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
- ksadk/memory/adk/long_term_memory.py +3 -2
- ksadk/memory/coordinator.py +461 -0
- ksadk/memory/events.py +202 -0
- ksadk/memory/extraction.py +228 -0
- ksadk/memory/ltm_backend_factory.py +16 -3
- ksadk/memory/models.py +316 -0
- ksadk/memory/policy.py +215 -0
- ksadk/memory/provider.py +47 -0
- ksadk/memory/provider_adapter.py +159 -0
- ksadk/memory/provider_resolver.py +71 -0
- ksadk/memory/providers/__init__.py +5 -0
- ksadk/memory/providers/local_sqlite.py +490 -0
- ksadk/memory/resolved_policy.py +145 -0
- ksadk/memory/service.py +198 -8
- ksadk/memory/tool.py +4 -0
- ksadk/model_proxy/bootstrap.py +16 -9
- ksadk/model_proxy/config.py +22 -1
- ksadk/model_proxy/detect.py +202 -9
- ksadk/model_proxy/namespace.py +67 -15
- ksadk/model_proxy/server.py +168 -6
- ksadk/model_proxy/transform.py +105 -3
- ksadk/observability/__init__.py +25 -0
- ksadk/observability/session_log.py +420 -0
- ksadk/observability/trajectory.py +105 -0
- ksadk/prompts/__init__.py +71 -0
- ksadk/prompts/compiler.py +215 -0
- ksadk/prompts/models.py +82 -0
- ksadk/prompts/projection.py +89 -0
- ksadk/prompts/resolved.py +137 -0
- ksadk/prompts/sources.py +233 -0
- ksadk/runners/_langgraph_runner_streams.py +822 -0
- ksadk/runners/adk_runner.py +14 -31
- ksadk/runners/base_runner.py +44 -3
- ksadk/runners/factory.py +3 -3
- ksadk/runners/langgraph_runner.py +252 -433
- ksadk/runners/utils/__init__.py +0 -10
- ksadk/runners/utils/loader.py +16 -0
- ksadk/runtime/__init__.py +67 -41
- ksadk/runtime/_runner_adapter/__init__.py +1 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
- ksadk/runtime/adapter.py +199 -16
- ksadk/runtime/conversation_execution.py +687 -0
- ksadk/runtime/executor.py +392 -0
- ksadk/runtime/factory.py +342 -0
- ksadk/runtime/framework_adapters.py +6 -12
- ksadk/runtime/hosted_finalizer.py +268 -0
- ksadk/runtime/launch.py +61 -0
- ksadk/runtime/preprocessing.py +49 -14
- ksadk/runtime/runner_adapter.py +330 -391
- ksadk/runtime/runner_loading.py +36 -0
- ksadk/runtime/usage.py +33 -0
- ksadk/sandbox/backends/e2b.py +36 -3
- ksadk/server/__init__.py +39 -4
- ksadk/server/app.py +18 -492
- ksadk/server/composition.py +36 -2
- ksadk/server/factory.py +210 -149
- ksadk/server/routes/common.py +15 -46
- ksadk/server/routes/control.py +13 -9
- ksadk/server/routes/kernel_ingress.py +258 -0
- ksadk/server/routes/misc.py +10 -33
- ksadk/server/routes/models.py +14 -6
- ksadk/server/routes/openai_compat.py +129 -27
- ksadk/server/routes/projection.py +84 -16
- ksadk/server/routes/run.py +347 -460
- ksadk/server/routes/sessions.py +37 -40
- ksadk/server/routes/streaming.py +52 -7
- ksadk/server/routes/workspace.py +54 -21
- ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
- ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
- ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
- ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
- ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
- ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
- ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
- ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
- ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
- ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
- ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
- ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
- ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
- ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
- ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
- ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
- ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
- ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
- ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
- ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
- ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
- ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
- ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
- ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
- ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
- ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
- ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
- ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
- ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
- ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
- ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
- ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
- ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
- ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
- ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
- ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
- ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
- ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
- ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
- ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
- ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
- ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
- ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
- ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
- ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
- ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
- ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
- ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
- ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
- ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
- ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
- ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
- ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
- ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
- ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
- ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
- ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
- ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
- ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
- ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
- ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
- ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
- ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
- ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
- ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
- ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
- ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
- ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
- ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
- ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
- ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
- ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
- ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
- ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
- ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +26 -9
- ksadk/sessions/_local_service_sync.py +688 -0
- ksadk/sessions/_local_tables.py +21 -0
- ksadk/sessions/_postgres_schema.py +305 -0
- ksadk/sessions/_postgres_tables.py +15 -0
- ksadk/sessions/base.py +80 -1
- ksadk/sessions/in_memory.py +53 -2
- ksadk/sessions/local_service.py +63 -604
- ksadk/sessions/postgres_service.py +58 -148
- ksadk/sessions/resilient.py +35 -1
- ksadk/skills/runtime/backends/e2b.py +1 -1
- ksadk/skills/service_client.py +13 -3
- ksadk/studio/__init__.py +5 -0
- ksadk/studio/agent_avatar_assets.py +120 -0
- ksadk/studio/agent_lifecycle.py +51 -0
- ksadk/studio/api.py +1598 -0
- ksadk/studio/api_catalog_routes.py +324 -0
- ksadk/studio/api_contracts.py +286 -0
- ksadk/studio/api_helpers.py +132 -0
- ksadk/studio/api_memory_routes.py +82 -0
- ksadk/studio/authoring.py +749 -0
- ksadk/studio/authoring_coordinator.py +1017 -0
- ksadk/studio/builder.py +397 -0
- ksadk/studio/capabilities.py +368 -0
- ksadk/studio/cloud.py +2099 -0
- ksadk/studio/codex_agent_service.py +694 -0
- ksadk/studio/codex_authoring.py +469 -0
- ksadk/studio/codex_builder.py +437 -0
- ksadk/studio/codex_manifest.py +307 -0
- ksadk/studio/codex_run.py +395 -0
- ksadk/studio/compiler.py +190 -0
- ksadk/studio/contracts.py +755 -0
- ksadk/studio/errors.py +47 -0
- ksadk/studio/event_store.py +214 -0
- ksadk/studio/framework_run.py +342 -0
- ksadk/studio/hosted_kernel.py +317 -0
- ksadk/studio/identifiers.py +33 -0
- ksadk/studio/manifest_resolver.py +131 -0
- ksadk/studio/mcp_runtime.py +229 -0
- ksadk/studio/model_client.py +629 -0
- ksadk/studio/model_profile_service.py +214 -0
- ksadk/studio/operations.py +275 -0
- ksadk/studio/otel_trace.py +1060 -0
- ksadk/studio/pagination.py +182 -0
- ksadk/studio/pcm_memory.py +85 -0
- ksadk/studio/python_tool_inspection.py +183 -0
- ksadk/studio/repository.py +327 -0
- ksadk/studio/resource_catalog.py +1260 -0
- ksadk/studio/run_service.py +1133 -0
- ksadk/studio/runtime_catalog.py +74 -0
- ksadk/studio/runtime_source.py +365 -0
- ksadk/studio/service.py +2249 -0
- ksadk/studio/shared_web.py +1004 -0
- ksadk/studio/skill_discovery.py +628 -0
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
- ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
- ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
- ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
- ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
- ksadk/studio/static/index.html +15 -0
- ksadk/studio/templates.py +722 -0
- ksadk/studio/validator.py +265 -0
- ksadk/studio/workspace.py +135 -0
- ksadk/tools/gateway.py +9 -0
- ksadk/toolsets/__init__.py +27 -1
- ksadk/toolsets/a2a.py +426 -0
- ksadk/tracing/__init__.py +19 -21
- ksadk/tracing/setup.py +317 -403
- ksadk/tracing/span_utils.py +0 -44
- ksadk/version.py +1 -1
- ksadk_runtime_common/memory_backend/registry.py +56 -56
- ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
- ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
- ksadk_runtime_common/workspace_files/router.py +8 -2
- agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
- ksadk/a2a/card_builder.py +0 -64
- ksadk/a2a/client.py +0 -309
- ksadk/events/parser.py +0 -191
- ksadk/harness/runner.py +0 -211
- ksadk/runners/codex_runner.py +0 -132
- ksadk/runners/utils/langfuse.py +0 -230
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
- ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
- ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
- ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
- ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
- ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
- ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
- ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
- ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
- ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
- ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
- ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
- ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
- ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
- ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
- ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
- ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
- ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
- ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
- ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
- ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
- ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
- ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
- ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
- ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
- ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
- ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
- ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
- ksadk/server/static/assets/katex-DATssjp1.js +0 -265
- ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
- ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
- ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
- ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
- ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
- ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
- ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
- ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
- ksadk/tracing/exporters/langfuse_exporter.py +0 -460
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
"""RuntimeAdapter 的统一生命周期路由与 Handle 所有权。
|
|
2
|
+
|
|
3
|
+
``_runs`` 只是当前进程的 handle cache:status、幂等、恢复资格和 owner 判断的
|
|
4
|
+
真相在 ``AgentKernelStore`` 的 durable Run 行;cache miss 不能等价于 Run 不
|
|
5
|
+
存在(见 :meth:`RuntimeExecutor.resolve_run`)。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import json
|
|
12
|
+
from contextlib import suppress
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from typing import TYPE_CHECKING
|
|
15
|
+
|
|
16
|
+
from ksadk.runtime.adapter import (
|
|
17
|
+
CancelResult,
|
|
18
|
+
CheckpointDescriptor,
|
|
19
|
+
PauseResult,
|
|
20
|
+
ResumePayload,
|
|
21
|
+
ResumeTarget,
|
|
22
|
+
RunHandle,
|
|
23
|
+
RuntimeAdapter,
|
|
24
|
+
RuntimeRegistry,
|
|
25
|
+
StartRequest,
|
|
26
|
+
)
|
|
27
|
+
from ksadk.runtime.launch import RuntimeLaunchContext
|
|
28
|
+
|
|
29
|
+
if TYPE_CHECKING: # pragma: no cover - import cycle guard
|
|
30
|
+
from ksadk.kernel.store import AgentKernelStore, RunRecord
|
|
31
|
+
|
|
32
|
+
_HandleKey = tuple[str, str, str]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class RunNotFoundError(LookupError):
|
|
36
|
+
"""durable Store 中不存在该 Run;cache miss 不是证据,必须查 Store。"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, run_id: str) -> None:
|
|
39
|
+
super().__init__(f"durable run not found: {run_id!r}")
|
|
40
|
+
self.run_id = run_id
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass
|
|
44
|
+
class DurableRun:
|
|
45
|
+
"""Store 中的 Run 真相 + 本进程 live handle(可能未 attach)。"""
|
|
46
|
+
|
|
47
|
+
run: "RunRecord"
|
|
48
|
+
live_handle: RunHandle | None = None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass
|
|
52
|
+
class _OwnedRun:
|
|
53
|
+
adapter: RuntimeAdapter
|
|
54
|
+
handle: RunHandle
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass
|
|
58
|
+
class RuntimeStartPreparation:
|
|
59
|
+
"""One adapter instance preflighted for exactly one subsequent start."""
|
|
60
|
+
|
|
61
|
+
context: RuntimeLaunchContext
|
|
62
|
+
adapter: RuntimeAdapter
|
|
63
|
+
consumed: bool = False
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class RuntimeExecutor:
|
|
67
|
+
"""让每个 Handle 始终回到创建或恢复它的 Adapter 实例。"""
|
|
68
|
+
|
|
69
|
+
def __init__(
|
|
70
|
+
self,
|
|
71
|
+
registry: RuntimeRegistry,
|
|
72
|
+
*,
|
|
73
|
+
kernel_store: "AgentKernelStore | None" = None,
|
|
74
|
+
) -> None:
|
|
75
|
+
self._registry = registry
|
|
76
|
+
self._kernel_store = kernel_store
|
|
77
|
+
self._runs: dict[_HandleKey, _OwnedRun] = {}
|
|
78
|
+
|
|
79
|
+
def create_adapter(self, context: RuntimeLaunchContext) -> RuntimeAdapter:
|
|
80
|
+
"""从本 executor 的 registry 创建一个 adapter。
|
|
81
|
+
|
|
82
|
+
生产 composition root 需要为 AgentKernelWorker 提供 adapter factory。
|
|
83
|
+
暴露这个窄入口可避免其绕过当前 RuntimeExecutor、另建默认 registry,
|
|
84
|
+
从而让普通执行、worker 与恢复走同一套 runtime-type 注册表。
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
return self._registry.create(context)
|
|
88
|
+
|
|
89
|
+
async def resolve_run(self, run_id: str) -> DurableRun:
|
|
90
|
+
"""以 durable Store 为真相解析 Run;cache 只是 live handle 提示。"""
|
|
91
|
+
|
|
92
|
+
durable = None
|
|
93
|
+
if self._kernel_store is not None:
|
|
94
|
+
durable = await self._kernel_store.load_run(run_id)
|
|
95
|
+
if durable is None:
|
|
96
|
+
# 没有 Store 时只能退回 cache;cache miss 不等价于 Run 不存在,
|
|
97
|
+
# 因此未配置 kernel_store 的旧调用方仍需显式处理缺失。
|
|
98
|
+
if self._kernel_store is not None:
|
|
99
|
+
raise RunNotFoundError(run_id)
|
|
100
|
+
cached = next(
|
|
101
|
+
(
|
|
102
|
+
owned.handle
|
|
103
|
+
for (_, rid, _), owned in self._runs.items()
|
|
104
|
+
if rid == run_id
|
|
105
|
+
),
|
|
106
|
+
None,
|
|
107
|
+
)
|
|
108
|
+
if cached is None:
|
|
109
|
+
raise RunNotFoundError(run_id)
|
|
110
|
+
return DurableRun(run=_cache_only_record(cached), live_handle=cached)
|
|
111
|
+
live = next(
|
|
112
|
+
(
|
|
113
|
+
owned.handle
|
|
114
|
+
for (_, rid, _), owned in self._runs.items()
|
|
115
|
+
if rid == run_id
|
|
116
|
+
),
|
|
117
|
+
None,
|
|
118
|
+
)
|
|
119
|
+
return DurableRun(run=durable, live_handle=live)
|
|
120
|
+
|
|
121
|
+
async def prepare_start(self, context: RuntimeLaunchContext) -> RuntimeStartPreparation:
|
|
122
|
+
"""Preflight a fresh adapter and retain it for the matching ``start``.
|
|
123
|
+
|
|
124
|
+
A response streaming endpoint must learn about lazy import/configuration
|
|
125
|
+
failures before its SSE headers are committed. Retaining the instance
|
|
126
|
+
matters: creating a second adapter after preflight could execute user
|
|
127
|
+
agent initialization twice.
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
adapter = self._registry.create(context)
|
|
131
|
+
await adapter.preflight()
|
|
132
|
+
return RuntimeStartPreparation(context=context, adapter=adapter)
|
|
133
|
+
|
|
134
|
+
async def start(
|
|
135
|
+
self,
|
|
136
|
+
context: RuntimeLaunchContext,
|
|
137
|
+
request: StartRequest,
|
|
138
|
+
*,
|
|
139
|
+
preparation: RuntimeStartPreparation | None = None,
|
|
140
|
+
) -> RunHandle:
|
|
141
|
+
adapter = self._take_prepared_adapter(context, preparation)
|
|
142
|
+
handle = await adapter.start(request)
|
|
143
|
+
expected_type = _normalize_runtime_type(context.runtime_type)
|
|
144
|
+
if _normalize_runtime_type(handle.runtime_type) != expected_type:
|
|
145
|
+
with suppress(Exception):
|
|
146
|
+
await adapter.close(handle)
|
|
147
|
+
raise ValueError(
|
|
148
|
+
"adapter returned a handle with the wrong runtime type: "
|
|
149
|
+
f"expected {expected_type!r}, got {handle.runtime_type!r}"
|
|
150
|
+
)
|
|
151
|
+
if handle.session_id != request.session_id:
|
|
152
|
+
with suppress(Exception):
|
|
153
|
+
await adapter.close(handle)
|
|
154
|
+
raise ValueError(
|
|
155
|
+
"adapter returned a handle for the wrong session: "
|
|
156
|
+
f"expected {request.session_id!r}, got {handle.session_id!r}"
|
|
157
|
+
)
|
|
158
|
+
if _handle_key(handle) in self._runs:
|
|
159
|
+
with suppress(Exception):
|
|
160
|
+
await adapter.close(handle)
|
|
161
|
+
raise RuntimeError(f"runtime handle is already attached: {_handle_key(handle)!r}")
|
|
162
|
+
self._record_owner(adapter, handle)
|
|
163
|
+
return handle
|
|
164
|
+
|
|
165
|
+
def stream(self, handle: RunHandle):
|
|
166
|
+
owned = self._resolve(handle)
|
|
167
|
+
return owned.adapter.stream(owned.handle)
|
|
168
|
+
|
|
169
|
+
async def cancel(self, handle: RunHandle) -> CancelResult:
|
|
170
|
+
owned = self._resolve(handle)
|
|
171
|
+
return await owned.adapter.cancel(owned.handle)
|
|
172
|
+
|
|
173
|
+
async def pause(self, handle: RunHandle) -> PauseResult:
|
|
174
|
+
owned = self._resolve(handle)
|
|
175
|
+
return await owned.adapter.pause(owned.handle)
|
|
176
|
+
|
|
177
|
+
async def submit(self, handle: RunHandle, payload: ResumePayload) -> None:
|
|
178
|
+
owned = self._resolve(handle)
|
|
179
|
+
await owned.adapter.submit(owned.handle, payload)
|
|
180
|
+
|
|
181
|
+
async def resume(
|
|
182
|
+
self,
|
|
183
|
+
handle: RunHandle,
|
|
184
|
+
target: ResumeTarget,
|
|
185
|
+
payload: ResumePayload | None,
|
|
186
|
+
) -> RunHandle:
|
|
187
|
+
old_key = _handle_key(handle)
|
|
188
|
+
owned = self._resolve(handle)
|
|
189
|
+
resumed = await owned.adapter.resume(owned.handle, target, payload)
|
|
190
|
+
if _normalize_runtime_type(resumed.runtime_type) != old_key[0]:
|
|
191
|
+
raise ValueError("resumed handle changed runtime type")
|
|
192
|
+
if resumed.session_id != old_key[2]:
|
|
193
|
+
raise ValueError("resumed handle changed session")
|
|
194
|
+
|
|
195
|
+
new_key = _handle_key(resumed)
|
|
196
|
+
if new_key != old_key:
|
|
197
|
+
existing = self._runs.get(new_key)
|
|
198
|
+
if existing is not None and existing.adapter is not owned.adapter:
|
|
199
|
+
raise RuntimeError(f"runtime handle is already attached: {new_key!r}")
|
|
200
|
+
self._runs.pop(old_key, None)
|
|
201
|
+
self._runs[new_key] = _OwnedRun(adapter=owned.adapter, handle=resumed)
|
|
202
|
+
return resumed
|
|
203
|
+
|
|
204
|
+
async def checkpoint(self, handle: RunHandle) -> CheckpointDescriptor:
|
|
205
|
+
owned = self._resolve(handle)
|
|
206
|
+
return await owned.adapter.checkpoint(owned.handle)
|
|
207
|
+
|
|
208
|
+
async def close(self, handle: RunHandle) -> None:
|
|
209
|
+
key = _handle_key(handle)
|
|
210
|
+
owned = self._resolve(handle)
|
|
211
|
+
try:
|
|
212
|
+
await owned.adapter.close(owned.handle)
|
|
213
|
+
finally:
|
|
214
|
+
self._runs.pop(key, None)
|
|
215
|
+
|
|
216
|
+
async def close_all(self) -> None:
|
|
217
|
+
"""Release every attached adapter while preserving best-effort cleanup."""
|
|
218
|
+
|
|
219
|
+
first_error: BaseException | None = None
|
|
220
|
+
for key, owned in list(self._runs.items()):
|
|
221
|
+
try:
|
|
222
|
+
await owned.adapter.close(owned.handle)
|
|
223
|
+
except BaseException as exc: # cleanup must continue for the other runtimes
|
|
224
|
+
if first_error is None:
|
|
225
|
+
first_error = exc
|
|
226
|
+
finally:
|
|
227
|
+
self._runs.pop(key, None)
|
|
228
|
+
if first_error is not None:
|
|
229
|
+
raise first_error
|
|
230
|
+
|
|
231
|
+
async def attach(
|
|
232
|
+
self,
|
|
233
|
+
context: RuntimeLaunchContext,
|
|
234
|
+
handle: RunHandle,
|
|
235
|
+
) -> RunHandle:
|
|
236
|
+
expected_type = _normalize_runtime_type(context.runtime_type)
|
|
237
|
+
if _normalize_runtime_type(handle.runtime_type) != expected_type:
|
|
238
|
+
raise ValueError("launch context and persisted handle runtime type differ")
|
|
239
|
+
if self.is_attached(handle):
|
|
240
|
+
return handle
|
|
241
|
+
|
|
242
|
+
adapter = self._registry.create(context)
|
|
243
|
+
restored = await adapter.attach(handle)
|
|
244
|
+
if restored != handle:
|
|
245
|
+
with suppress(Exception):
|
|
246
|
+
await adapter.close(restored)
|
|
247
|
+
raise ValueError("adapter attach must preserve persisted handle identity")
|
|
248
|
+
self._record_owner(adapter, restored)
|
|
249
|
+
return restored
|
|
250
|
+
|
|
251
|
+
async def attach_record(
|
|
252
|
+
self,
|
|
253
|
+
run: "RunRecord",
|
|
254
|
+
context: RuntimeLaunchContext,
|
|
255
|
+
) -> RunHandle:
|
|
256
|
+
"""Attach a run from its durable record (cross-process recovery path).
|
|
257
|
+
|
|
258
|
+
一个新进程没有任何 ``_runs`` 缓存;durable Run 行的 ``handle`` +
|
|
259
|
+
``handle_digest`` 是唯一恢复线索。digest 不匹配即拒绝——被篡改或
|
|
260
|
+
版本漂移的 handle 绝不能接回 live 执行。
|
|
261
|
+
"""
|
|
262
|
+
|
|
263
|
+
handle_dump = run.metadata.get("handle")
|
|
264
|
+
digest = run.metadata.get("handle_digest")
|
|
265
|
+
if not isinstance(handle_dump, dict) or not isinstance(digest, str):
|
|
266
|
+
raise ValueError(
|
|
267
|
+
f"durable run {run.run_id!r} has no durably attachable handle"
|
|
268
|
+
)
|
|
269
|
+
handle = RunHandle.model_validate(handle_dump)
|
|
270
|
+
if handle_digest(handle) != digest:
|
|
271
|
+
raise ValueError(f"handle digest mismatch for run {run.run_id!r}")
|
|
272
|
+
return await self.attach(context, handle)
|
|
273
|
+
|
|
274
|
+
def is_attached(self, handle: RunHandle) -> bool:
|
|
275
|
+
owned = self._runs.get(_handle_key(handle))
|
|
276
|
+
return owned is not None and owned.handle == handle
|
|
277
|
+
|
|
278
|
+
def find_handle(
|
|
279
|
+
self,
|
|
280
|
+
runtime_type: str,
|
|
281
|
+
run_id: str,
|
|
282
|
+
session_id: str,
|
|
283
|
+
) -> RunHandle | None:
|
|
284
|
+
"""Return the attached handle for one exact runtime/run/session scope."""
|
|
285
|
+
|
|
286
|
+
owned = self._runs.get(
|
|
287
|
+
(
|
|
288
|
+
_normalize_runtime_type(runtime_type),
|
|
289
|
+
str(run_id),
|
|
290
|
+
str(session_id),
|
|
291
|
+
)
|
|
292
|
+
)
|
|
293
|
+
return owned.handle if owned is not None else None
|
|
294
|
+
|
|
295
|
+
def native_capabilities(self, context: RuntimeLaunchContext) -> dict[str, object]:
|
|
296
|
+
"""Read the capability declaration from the registered Runtime implementation."""
|
|
297
|
+
|
|
298
|
+
adapter = self._registry.create(context)
|
|
299
|
+
return dict(adapter.runtime.native_capabilities())
|
|
300
|
+
|
|
301
|
+
def capability_matrix(self, context: RuntimeLaunchContext) -> dict[str, object]:
|
|
302
|
+
"""Return the canonical typed RuntimeCapabilityMatrix/v1 projection.
|
|
303
|
+
|
|
304
|
+
``native_capabilities`` is a compatibility view whose shape varies by
|
|
305
|
+
framework. UI clients need the versioned matrix so optional execution
|
|
306
|
+
modes can be exposed only when the selected runtime declares support.
|
|
307
|
+
"""
|
|
308
|
+
|
|
309
|
+
adapter = self._registry.create(context)
|
|
310
|
+
return adapter.capabilities().model_dump(mode="json")
|
|
311
|
+
|
|
312
|
+
def registered_runtime_types(self) -> list[str]:
|
|
313
|
+
"""Expose Registry membership without leaking or duplicating the Registry."""
|
|
314
|
+
|
|
315
|
+
return self._registry.registered_types()
|
|
316
|
+
|
|
317
|
+
def _resolve(self, handle: RunHandle) -> _OwnedRun:
|
|
318
|
+
key = _handle_key(handle)
|
|
319
|
+
try:
|
|
320
|
+
owned = self._runs[key]
|
|
321
|
+
except KeyError:
|
|
322
|
+
raise KeyError(f"runtime handle is not attached: {key!r}") from None
|
|
323
|
+
if owned.handle != handle:
|
|
324
|
+
raise ValueError(f"runtime handle payload does not match owner: {key!r}")
|
|
325
|
+
return owned
|
|
326
|
+
|
|
327
|
+
def _record_owner(self, adapter: RuntimeAdapter, handle: RunHandle) -> None:
|
|
328
|
+
key = _handle_key(handle)
|
|
329
|
+
if key in self._runs:
|
|
330
|
+
raise RuntimeError(f"runtime handle is already attached: {key!r}")
|
|
331
|
+
self._runs[key] = _OwnedRun(adapter=adapter, handle=handle)
|
|
332
|
+
|
|
333
|
+
def _take_prepared_adapter(
|
|
334
|
+
self,
|
|
335
|
+
context: RuntimeLaunchContext,
|
|
336
|
+
preparation: RuntimeStartPreparation | None,
|
|
337
|
+
) -> RuntimeAdapter:
|
|
338
|
+
if preparation is None:
|
|
339
|
+
return self._registry.create(context)
|
|
340
|
+
if preparation.consumed:
|
|
341
|
+
raise RuntimeError("runtime start preparation was already consumed")
|
|
342
|
+
if preparation.context != context:
|
|
343
|
+
raise ValueError("runtime start preparation does not match launch context")
|
|
344
|
+
preparation.consumed = True
|
|
345
|
+
return preparation.adapter
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def handle_digest(handle: RunHandle) -> str:
|
|
349
|
+
"""Stable digest of one durable handle (cross-process recovery evidence)."""
|
|
350
|
+
|
|
351
|
+
payload = json.dumps(
|
|
352
|
+
handle.model_dump(mode="json"),
|
|
353
|
+
sort_keys=True,
|
|
354
|
+
separators=(",", ":"),
|
|
355
|
+
ensure_ascii=False,
|
|
356
|
+
).encode("utf-8")
|
|
357
|
+
return hashlib.sha256(payload).hexdigest()
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
def _cache_only_record(handle: RunHandle) -> "RunRecord":
|
|
361
|
+
from ksadk.kernel.state import RunState
|
|
362
|
+
from ksadk.kernel.store import RunRecord
|
|
363
|
+
|
|
364
|
+
# 无 kernel_store 的旧调用方路径:state 只能标记 pending,真相以 Store 为准。
|
|
365
|
+
return RunRecord(
|
|
366
|
+
run_id=handle.run_id,
|
|
367
|
+
agent_instance_id="",
|
|
368
|
+
session_id=handle.session_id,
|
|
369
|
+
state=RunState.PENDING,
|
|
370
|
+
metadata={"source": "process_cache", "runtime_type": handle.runtime_type},
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def _normalize_runtime_type(runtime_type: str) -> str:
|
|
375
|
+
return runtime_type.strip().lower()
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
def _handle_key(handle: RunHandle) -> _HandleKey:
|
|
379
|
+
return (
|
|
380
|
+
_normalize_runtime_type(handle.runtime_type),
|
|
381
|
+
handle.run_id,
|
|
382
|
+
handle.session_id,
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
__all__ = [
|
|
387
|
+
"RuntimeExecutor",
|
|
388
|
+
"RuntimeStartPreparation",
|
|
389
|
+
"DurableRun",
|
|
390
|
+
"RunNotFoundError",
|
|
391
|
+
"handle_digest",
|
|
392
|
+
]
|