agentengine-sdk-python 0.8.1__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.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +22 -2
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/RECORD +356 -222
- ksadk/a2a/_space_client_events.py +381 -0
- ksadk/a2a/event_adapter.py +156 -64
- ksadk/a2a/executor.py +179 -63
- ksadk/a2a/space_client.py +6 -333
- ksadk/a2ui/core.py +222 -53
- ksadk/agui/_agent_helpers.py +243 -0
- ksadk/agui/a2ui_projection.py +12 -5
- ksadk/agui/agent.py +443 -259
- ksadk/api/client.py +525 -27
- ksadk/builders/code_builder.py +284 -8
- ksadk/builders/container_builder.py +8 -1
- ksadk/builders/managed_runtime_builder.py +39 -35
- ksadk/cli/__init__.py +17 -0
- ksadk/cli/cmd_dashboard.py +15 -1
- ksadk/cli/cmd_deploy.py +10 -2
- ksadk/cli/cmd_eval.py +66 -9
- ksadk/cli/cmd_evalset.py +284 -0
- ksadk/cli/cmd_files.py +5 -1
- ksadk/cli/cmd_hermes.py +1 -126
- ksadk/cli/cmd_invoke.py +28 -38
- ksadk/cli/cmd_managed_runtime.py +95 -0
- ksadk/cli/cmd_observe.py +85 -0
- ksadk/cli/cmd_openclaw.py +1 -435
- ksadk/cli/cmd_replay.py +28 -4
- ksadk/cli/cmd_studio.py +99 -8
- ksadk/cli/cmd_web.py +10 -2
- ksadk/cli/hermes_env.py +151 -0
- ksadk/cli/invoke_payload.py +49 -0
- ksadk/cli/openclaw_env.py +458 -0
- ksadk/codex/client.py +180 -30
- ksadk/codex/runtime.py +428 -326
- ksadk/configs/env_registry.py +66 -12
- ksadk/configs/env_registry_pcm.py +181 -0
- ksadk/configs/env_var_spec.py +18 -0
- ksadk/configs/global_config.py +5 -0
- 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/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 +184 -2
- ksadk/conversations/runtime_invocation.py +81 -3
- ksadk/conversations/runtime_observability.py +141 -0
- ksadk/conversations/runtime_payloads.py +42 -0
- ksadk/conversations/runtime_preparation.py +272 -2
- ksadk/conversations/runtime_resume.py +20 -1
- ksadk/conversations/runtime_stream_events.py +94 -9
- 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 +5 -0
- ksadk/deployment/providers/serverless.py +143 -69
- ksadk/evaluation/__init__.py +32 -0
- ksadk/evaluation/a2a_adapter.py +9 -1
- ksadk/evaluation/adapters.py +18 -5
- 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 +73 -4
- ksadk/evaluation/evaluators.py +183 -17
- ksadk/evaluation/evidence.py +258 -0
- ksadk/evaluation/executor.py +31 -6
- ksadk/evaluation/local_adapter.py +550 -0
- ksadk/evaluation/service_env.py +27 -0
- ksadk/evaluation/studio_build_adapter.py +253 -0
- ksadk/evaluation/target.py +15 -6
- 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 -265
- ksadk/events/session_event.py +324 -0
- ksadk/events/store.py +3 -316
- ksadk/events/v1_compat.py +41 -0
- ksadk/harness/runtime.py +160 -57
- 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 +7 -0
- ksadk/knowledge_base/service.py +32 -5
- 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 +384 -2
- ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
- 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 +188 -6
- ksadk/model_proxy/bootstrap.py +16 -9
- ksadk/model_proxy/detect.py +202 -9
- ksadk/model_proxy/namespace.py +39 -15
- ksadk/model_proxy/server.py +24 -5
- ksadk/model_proxy/transform.py +60 -2
- 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 +5 -5
- ksadk/runners/base_runner.py +16 -0
- ksadk/runners/factory.py +1 -2
- ksadk/runners/langgraph_runner.py +198 -437
- ksadk/runtime/_runner_adapter/__init__.py +1 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
- ksadk/runtime/adapter.py +118 -2
- ksadk/runtime/conversation_execution.py +316 -182
- ksadk/runtime/executor.py +144 -3
- ksadk/runtime/factory.py +193 -7
- ksadk/runtime/hosted_finalizer.py +268 -0
- ksadk/runtime/launch.py +14 -1
- ksadk/runtime/preprocessing.py +25 -3
- ksadk/runtime/runner_adapter.py +288 -508
- ksadk/runtime/usage.py +33 -0
- ksadk/sandbox/backends/e2b.py +35 -2
- ksadk/server/composition.py +8 -0
- ksadk/server/factory.py +69 -6
- ksadk/server/routes/kernel_ingress.py +258 -0
- ksadk/server/routes/openai_compat.py +88 -8
- ksadk/server/routes/projection.py +35 -20
- ksadk/server/routes/run.py +94 -0
- ksadk/server/routes/sessions.py +2 -0
- ksadk/server/routes/streaming.py +5 -2
- ksadk/server/static/assets/{ArtifactsPanel-CakCqxEN.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-CynLknyO.js → CodeBlock-DOH6MVcn.js} +4 -4
- ksadk/server/static/assets/{MathMessageMarkdown-3sQdOysS.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-B_fH2YuH.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-D6rFLaVV.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
- ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
- ksadk/server/static/assets/{chunk-4BX2VUAB-B9drTgOW.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-ChNs_Mdk.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-Dli7qW-B.js → dist-8hqcx0sU.js} +1 -1
- ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
- ksadk/server/static/assets/{dist-C1sz5Eo3.js → dist-BE7bu-DL.js} +1 -1
- ksadk/server/static/assets/{dist-fhOuWds5.js → dist-BVDffZ0U.js} +1 -1
- ksadk/server/static/assets/{dist-BjOdlDjj.js → dist-BX8z72IC.js} +1 -1
- ksadk/server/static/assets/{dist-DsHPdk3W.js → dist-Bf2M8m3N.js} +1 -1
- ksadk/server/static/assets/{dist-o2OVmKvt.js → dist-BjU6y-A2.js} +1 -1
- ksadk/server/static/assets/{dist-DWKByxWV.js → dist-BytlxIDT.js} +1 -1
- ksadk/server/static/assets/{dist-DJN_6Y39.js → dist-CSh_DE14.js} +1 -1
- ksadk/server/static/assets/{dist-DQU9EWw-.js → dist-CXYYBw3_.js} +1 -1
- ksadk/server/static/assets/{dist-4N2NMVYg.js → dist-C_wsv-Qd.js} +1 -1
- ksadk/server/static/assets/{dist-gLnrGsoU.js → dist-ClxGviKw.js} +1 -1
- ksadk/server/static/assets/{dist-j6Dxmf_j.js → dist-CttYUqzS.js} +1 -1
- ksadk/server/static/assets/{dist-D6MpCZtz.js → dist-DNp6rLRA.js} +1 -1
- ksadk/server/static/assets/{dist-BB3-OwTQ.js → dist-DUX-id_F.js} +1 -1
- ksadk/server/static/assets/{dist-_pHPTyZ-.js → dist-DmldrHd_.js} +1 -1
- ksadk/server/static/assets/{dist-CWV4lDr1.js → dist-DnfXs8Vn.js} +2 -2
- ksadk/server/static/assets/{dist-B5oS1zcj.js → dist-Dq9gLD7L.js} +1 -1
- ksadk/server/static/assets/{dist-B-jNR6Vn.js → dist-W-TIVntx.js} +1 -1
- ksadk/server/static/assets/{dist-BIlKoW0k.js → dist-dDdADKFA.js} +1 -1
- ksadk/server/static/assets/{dist-X4TnqwOK.js → dist-dydu68Fl.js} +1 -1
- ksadk/server/static/assets/{dist-CmZHzlwZ.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-K0OOfVna.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-8LeOJaZp.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-C6uCgZrW.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
- ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
- ksadk/server/static/assets/{linear-hdBcYzM8.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-Bjy_2v4_.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-BmkRbwCg.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-l6iXmU65.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-Cq6UBeQB.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-DEz24vV0.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/studio/api.py +577 -25
- ksadk/studio/api_contracts.py +114 -5
- ksadk/studio/api_memory_routes.py +82 -0
- ksadk/studio/authoring.py +252 -27
- ksadk/studio/authoring_coordinator.py +799 -67
- ksadk/studio/builder.py +88 -11
- ksadk/studio/capabilities.py +17 -0
- ksadk/studio/cloud.py +1916 -95
- ksadk/studio/codex_agent_service.py +125 -14
- ksadk/studio/codex_authoring.py +469 -0
- ksadk/studio/codex_builder.py +138 -25
- ksadk/studio/codex_manifest.py +51 -22
- ksadk/studio/codex_run.py +46 -3
- ksadk/studio/compiler.py +1 -0
- ksadk/studio/contracts.py +114 -3
- ksadk/studio/event_store.py +25 -95
- ksadk/studio/framework_run.py +231 -3
- ksadk/studio/hosted_kernel.py +317 -0
- ksadk/studio/manifest_resolver.py +131 -0
- ksadk/studio/model_client.py +95 -9
- ksadk/studio/model_profile_service.py +1 -1
- ksadk/studio/operations.py +37 -5
- ksadk/studio/otel_trace.py +348 -42
- ksadk/studio/pcm_memory.py +85 -0
- ksadk/studio/repository.py +23 -2
- ksadk/studio/resource_catalog.py +43 -0
- ksadk/studio/run_service.py +563 -137
- ksadk/studio/runtime_source.py +42 -16
- ksadk/studio/service.py +1180 -72
- ksadk/studio/shared_web.py +32 -22
- ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
- ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
- ksadk/studio/static/index.html +2 -2
- ksadk/studio/templates.py +100 -8
- ksadk/studio/validator.py +19 -0
- ksadk/studio/workspace.py +30 -32
- ksadk/tracing/setup.py +304 -3
- ksadk/version.py +1 -1
- ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
- ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
- ksadk/events/parser.py +0 -191
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
- ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +0 -1
- ksadk/server/static/assets/arc-DrgjcKhl.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +0 -1
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-BXoVRbQ6.js +0 -36
- ksadk/server/static/assets/blockDiagram-GPEHLZMM-BnaB3Ywv.js +0 -132
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dw4weZcp.js +0 -10
- ksadk/server/static/assets/channel-Dt3rQTFI.js +0 -1
- ksadk/server/static/assets/chunk-2J33WTMH-ChjpLK7j.js +0 -1
- ksadk/server/static/assets/chunk-55IACEB6-CK4ROATy.js +0 -1
- ksadk/server/static/assets/chunk-727SXJPM-B9KtTTgw.js +0 -206
- ksadk/server/static/assets/chunk-AQP2D5EJ-1O1mki3m.js +0 -231
- ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +0 -1
- ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
- ksadk/server/static/assets/dagre-BM42HDAG-D0QXg_MQ.js +0 -4
- ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
- ksadk/server/static/assets/diagram-2AECGRRQ-DBDDKwBQ.js +0 -43
- ksadk/server/static/assets/diagram-5GNKFQAL-BkwDOxmO.js +0 -10
- ksadk/server/static/assets/diagram-KO2AKTUF-Bv8waYvY.js +0 -3
- ksadk/server/static/assets/diagram-LMA3HP47-e1VECDdu.js +0 -24
- ksadk/server/static/assets/diagram-OG6HWLK6-Ds9adfRl.js +0 -24
- ksadk/server/static/assets/dist-B5J2uhNk.js +0 -1
- ksadk/server/static/assets/erDiagram-TEJ5UH35-BPItFKH6.js +0 -85
- ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +0 -1
- ksadk/server/static/assets/flowDiagram-I6XJVG4X-BbYB9w5Y.js +0 -162
- ksadk/server/static/assets/ganttDiagram-6RSMTGT7-TQXa0KXv.js +0 -292
- ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +0 -1
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-bKblCnpa.js +0 -106
- ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
- ksadk/server/static/assets/index-R52pJJvg.js +0 -177
- ksadk/server/static/assets/index-jJr3_955.css +0 -2
- ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +0 -1
- ksadk/server/static/assets/infoDiagram-5YYISTIA-BGVT7J_i.js +0 -2
- ksadk/server/static/assets/katex-CYWseY5E.js +0 -265
- ksadk/server/static/assets/mermaid-parser.core-BWrDjSZM.js +0 -161
- ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +0 -1
- ksadk/server/static/assets/pieDiagram-4H26LBE5-GmmqNiVH.js +0 -30
- ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +0 -1
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DSWFqL7c.js +0 -84
- ksadk/server/static/assets/stateDiagram-AJRCARHV-qzTQpg3Y.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +0 -1
- ksadk/server/static/assets/vennDiagram-CIIHVFJN-CMCixki2.js +0 -34
- ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +0 -1
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-CVzB8F9K.js +0 -78
- ksadk/server/static/assets/xychartDiagram-2RQKCTM6-BFBqBLc1.js +0 -7
- ksadk/studio/evaluation.py +0 -192
- ksadk/studio/static/assets/index-CaEN0eTR.css +0 -1
- ksadk/studio/static/assets/index-DI2eY_NH.js +0 -252
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
ksadk/runtime/executor.py
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
|
-
"""RuntimeAdapter 的统一生命周期路由与 Handle 所有权。
|
|
1
|
+
"""RuntimeAdapter 的统一生命周期路由与 Handle 所有权。
|
|
2
|
+
|
|
3
|
+
``_runs`` 只是当前进程的 handle cache:status、幂等、恢复资格和 owner 判断的
|
|
4
|
+
真相在 ``AgentKernelStore`` 的 durable Run 行;cache miss 不能等价于 Run 不
|
|
5
|
+
存在(见 :meth:`RuntimeExecutor.resolve_run`)。
|
|
6
|
+
"""
|
|
2
7
|
|
|
3
8
|
from __future__ import annotations
|
|
4
9
|
|
|
10
|
+
import hashlib
|
|
11
|
+
import json
|
|
5
12
|
from contextlib import suppress
|
|
6
13
|
from dataclasses import dataclass
|
|
14
|
+
from typing import TYPE_CHECKING
|
|
7
15
|
|
|
8
16
|
from ksadk.runtime.adapter import (
|
|
9
17
|
CancelResult,
|
|
@@ -18,9 +26,28 @@ from ksadk.runtime.adapter import (
|
|
|
18
26
|
)
|
|
19
27
|
from ksadk.runtime.launch import RuntimeLaunchContext
|
|
20
28
|
|
|
29
|
+
if TYPE_CHECKING: # pragma: no cover - import cycle guard
|
|
30
|
+
from ksadk.kernel.store import AgentKernelStore, RunRecord
|
|
31
|
+
|
|
21
32
|
_HandleKey = tuple[str, str, str]
|
|
22
33
|
|
|
23
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
|
+
|
|
24
51
|
@dataclass
|
|
25
52
|
class _OwnedRun:
|
|
26
53
|
adapter: RuntimeAdapter
|
|
@@ -39,10 +66,58 @@ class RuntimeStartPreparation:
|
|
|
39
66
|
class RuntimeExecutor:
|
|
40
67
|
"""让每个 Handle 始终回到创建或恢复它的 Adapter 实例。"""
|
|
41
68
|
|
|
42
|
-
def __init__(
|
|
69
|
+
def __init__(
|
|
70
|
+
self,
|
|
71
|
+
registry: RuntimeRegistry,
|
|
72
|
+
*,
|
|
73
|
+
kernel_store: "AgentKernelStore | None" = None,
|
|
74
|
+
) -> None:
|
|
43
75
|
self._registry = registry
|
|
76
|
+
self._kernel_store = kernel_store
|
|
44
77
|
self._runs: dict[_HandleKey, _OwnedRun] = {}
|
|
45
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
|
+
|
|
46
121
|
async def prepare_start(self, context: RuntimeLaunchContext) -> RuntimeStartPreparation:
|
|
47
122
|
"""Preflight a fresh adapter and retain it for the matching ``start``.
|
|
48
123
|
|
|
@@ -173,6 +248,29 @@ class RuntimeExecutor:
|
|
|
173
248
|
self._record_owner(adapter, restored)
|
|
174
249
|
return restored
|
|
175
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
|
+
|
|
176
274
|
def is_attached(self, handle: RunHandle) -> bool:
|
|
177
275
|
owned = self._runs.get(_handle_key(handle))
|
|
178
276
|
return owned is not None and owned.handle == handle
|
|
@@ -200,6 +298,17 @@ class RuntimeExecutor:
|
|
|
200
298
|
adapter = self._registry.create(context)
|
|
201
299
|
return dict(adapter.runtime.native_capabilities())
|
|
202
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
|
+
|
|
203
312
|
def registered_runtime_types(self) -> list[str]:
|
|
204
313
|
"""Expose Registry membership without leaking or duplicating the Registry."""
|
|
205
314
|
|
|
@@ -236,6 +345,32 @@ class RuntimeExecutor:
|
|
|
236
345
|
return preparation.adapter
|
|
237
346
|
|
|
238
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
|
+
|
|
239
374
|
def _normalize_runtime_type(runtime_type: str) -> str:
|
|
240
375
|
return runtime_type.strip().lower()
|
|
241
376
|
|
|
@@ -248,4 +383,10 @@ def _handle_key(handle: RunHandle) -> _HandleKey:
|
|
|
248
383
|
)
|
|
249
384
|
|
|
250
385
|
|
|
251
|
-
__all__ = [
|
|
386
|
+
__all__ = [
|
|
387
|
+
"RuntimeExecutor",
|
|
388
|
+
"RuntimeStartPreparation",
|
|
389
|
+
"DurableRun",
|
|
390
|
+
"RunNotFoundError",
|
|
391
|
+
"handle_digest",
|
|
392
|
+
]
|
ksadk/runtime/factory.py
CHANGED
|
@@ -4,20 +4,168 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import dataclasses
|
|
6
6
|
import os
|
|
7
|
+
import tempfile
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
from typing import Any
|
|
9
10
|
|
|
10
11
|
from ksadk.codex.client import AsyncCodexClient
|
|
11
12
|
from ksadk.codex.runtime import CodexRuntimeAdapter
|
|
12
13
|
from ksadk.runners.base_runner import BaseRunner
|
|
14
|
+
from ksadk.runtime.adapter import StartRequest
|
|
13
15
|
from ksadk.runtime.adapter import RuntimeAdapter, RuntimeRegistry
|
|
14
16
|
from ksadk.runtime.framework_adapters import ADKRuntimeAdapter, LangGraphRuntimeAdapter
|
|
15
17
|
from ksadk.runtime.launch import RuntimeLaunchContext
|
|
16
18
|
|
|
17
19
|
|
|
20
|
+
def kernel_start_request_defaults(context: RuntimeLaunchContext) -> dict[str, Any]:
|
|
21
|
+
"""Project an admitted launch manifest into immutable Kernel turn defaults.
|
|
22
|
+
|
|
23
|
+
The durable Kernel owns enqueue ordering, while the deployment manifest
|
|
24
|
+
owns model, instructions, sandbox and approval policy. Keeping this
|
|
25
|
+
projection beside the RuntimeAdapter factory prevents the Kernel ingress
|
|
26
|
+
from trusting caller-supplied execution policy.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
config = dict(context.config)
|
|
30
|
+
defaults: dict[str, Any] = {}
|
|
31
|
+
detection_name = str(getattr(context.detection, "name", "") or "").strip()
|
|
32
|
+
if detection_name:
|
|
33
|
+
defaults["agent_id"] = detection_name
|
|
34
|
+
model = str(config.get("model") or "").strip()
|
|
35
|
+
if model:
|
|
36
|
+
defaults["model"] = model
|
|
37
|
+
raw_allowed_models = (
|
|
38
|
+
config.get("models") or config.get("allowed_models") or config.get("allowedModels") or []
|
|
39
|
+
)
|
|
40
|
+
allowed_models = (
|
|
41
|
+
{str(item).strip() for item in raw_allowed_models if str(item).strip()}
|
|
42
|
+
if isinstance(raw_allowed_models, (list, tuple, set))
|
|
43
|
+
else set()
|
|
44
|
+
)
|
|
45
|
+
# 不把默认 model 自动加进白名单:白名单只在显式声明 models/allowedModels
|
|
46
|
+
# 时才存在(显式声明 = 收紧;只配默认 = 不限制 run 级覆盖)。
|
|
47
|
+
if allowed_models:
|
|
48
|
+
defaults["allowed_models"] = sorted(allowed_models)
|
|
49
|
+
if context.runtime_type != "codex":
|
|
50
|
+
return defaults
|
|
51
|
+
|
|
52
|
+
prompt = str(config.get("prompt") or "").strip()
|
|
53
|
+
task_prompt = str(config.get("task_prompt") or "").strip()
|
|
54
|
+
base_instructions = prompt
|
|
55
|
+
if task_prompt:
|
|
56
|
+
base_instructions = f"{prompt}\n\n{task_prompt}" if prompt else task_prompt
|
|
57
|
+
|
|
58
|
+
raw_sandbox = str(config.get("sandbox") or "read_only").strip().lower()
|
|
59
|
+
raw_approval = str(config.get("approval_mode") or "").strip().lower()
|
|
60
|
+
approval_profiles = {
|
|
61
|
+
"ask": ("workspace-write", "manual"),
|
|
62
|
+
"risk": ("workspace-write", "auto_review"),
|
|
63
|
+
"full": ("full-access", "deny_all"),
|
|
64
|
+
}
|
|
65
|
+
sandbox_profiles = {
|
|
66
|
+
"read_only": ("read-only", "deny_all"),
|
|
67
|
+
"read-only": ("read-only", "deny_all"),
|
|
68
|
+
"workspace_write": ("workspace-write", "deny_all"),
|
|
69
|
+
"workspace-write": ("workspace-write", "deny_all"),
|
|
70
|
+
"workspace_write_auto": ("workspace-write", "auto_review"),
|
|
71
|
+
"workspace-write-auto": ("workspace-write", "auto_review"),
|
|
72
|
+
"full_access": ("full-access", "deny_all"),
|
|
73
|
+
"full-access": ("full-access", "deny_all"),
|
|
74
|
+
}
|
|
75
|
+
if raw_approval in approval_profiles:
|
|
76
|
+
sandbox, approval = approval_profiles[raw_approval]
|
|
77
|
+
else:
|
|
78
|
+
sandbox, default_approval = sandbox_profiles.get(raw_sandbox, ("read-only", "deny_all"))
|
|
79
|
+
approval = raw_approval or default_approval
|
|
80
|
+
|
|
81
|
+
request_config: dict[str, Any] = {
|
|
82
|
+
"sandbox_read_only": sandbox == "read-only",
|
|
83
|
+
"sandbox": sandbox,
|
|
84
|
+
"approval_mode": approval,
|
|
85
|
+
"cwd": str(context.project_dir),
|
|
86
|
+
"summary": "auto",
|
|
87
|
+
"ephemeral": False,
|
|
88
|
+
}
|
|
89
|
+
if base_instructions:
|
|
90
|
+
request_config["base_instructions"] = base_instructions
|
|
91
|
+
defaults["config"] = request_config
|
|
92
|
+
return defaults
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def apply_runtime_start_request_defaults(
|
|
96
|
+
context: RuntimeLaunchContext,
|
|
97
|
+
request: StartRequest,
|
|
98
|
+
) -> StartRequest:
|
|
99
|
+
"""Apply deployment-owned launch policy to a direct runtime start.
|
|
100
|
+
|
|
101
|
+
AgentKernelWorker already projects these defaults before ``adapter.start``.
|
|
102
|
+
Foreground RunAgent, ``/run_sse`` and OpenAI-compatible routes also create
|
|
103
|
+
``StartRequest`` objects directly, so they must use the same projection or
|
|
104
|
+
a deployed Codex agent silently falls back to the generic Codex role.
|
|
105
|
+
|
|
106
|
+
Request-local config is internal runtime state, not caller-owned policy;
|
|
107
|
+
retain it for local Studio builds while using the manifest model as the
|
|
108
|
+
fallback (and as the fail-closed fallback for an explicit allow-list).
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
defaults = kernel_start_request_defaults(context)
|
|
112
|
+
default_model = str(defaults.get("model") or "").strip() or None
|
|
113
|
+
requested_model = str(request.model or "").strip()
|
|
114
|
+
allowed_models = {
|
|
115
|
+
str(item).strip()
|
|
116
|
+
for item in (defaults.get("allowed_models") or [])
|
|
117
|
+
if str(item).strip()
|
|
118
|
+
}
|
|
119
|
+
selected_model = (
|
|
120
|
+
requested_model
|
|
121
|
+
if requested_model and (not allowed_models or requested_model in allowed_models)
|
|
122
|
+
else default_model
|
|
123
|
+
)
|
|
124
|
+
config = {
|
|
125
|
+
**dict(defaults.get("config") or {}),
|
|
126
|
+
**dict(request.config or {}),
|
|
127
|
+
}
|
|
128
|
+
return request.model_copy(
|
|
129
|
+
update={
|
|
130
|
+
"agent_id": request.agent_id or defaults.get("agent_id"),
|
|
131
|
+
"model": selected_model,
|
|
132
|
+
"config": config,
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _manifest_mcp_overrides(config: dict[str, Any]) -> list[str]:
|
|
138
|
+
"""Translate declarative MCP bindings into native Codex config keys."""
|
|
139
|
+
|
|
140
|
+
overrides: list[str] = []
|
|
141
|
+
servers = config.get("mcp_servers") or []
|
|
142
|
+
if not isinstance(servers, (list, tuple)):
|
|
143
|
+
return overrides
|
|
144
|
+
for server in servers:
|
|
145
|
+
if not isinstance(server, dict):
|
|
146
|
+
continue
|
|
147
|
+
name = str(server.get("name") or "").strip()
|
|
148
|
+
url = str(server.get("url") or "").strip()
|
|
149
|
+
if not name or not url:
|
|
150
|
+
continue
|
|
151
|
+
overrides.append(f"mcp_servers.{name}.url={url}")
|
|
152
|
+
env_key = str(server.get("env_key") or "").strip()
|
|
153
|
+
if env_key:
|
|
154
|
+
overrides.append(f"mcp_servers.{name}.bearer_token_env_var={env_key}")
|
|
155
|
+
return overrides
|
|
156
|
+
|
|
157
|
+
|
|
18
158
|
def _create_codex(context: RuntimeLaunchContext) -> RuntimeAdapter:
|
|
19
159
|
client_factory = context.services.codex_client_factory or AsyncCodexClient
|
|
20
|
-
|
|
160
|
+
config = dict(context.config)
|
|
161
|
+
overrides = list(config.get("codex_overrides") or [])
|
|
162
|
+
manifest_mcp_overrides = _manifest_mcp_overrides(config)
|
|
163
|
+
overrides.extend(item for item in manifest_mcp_overrides if item not in overrides)
|
|
164
|
+
projected_config = kernel_start_request_defaults(context).get("config") or {}
|
|
165
|
+
if manifest_mcp_overrides and projected_config.get("sandbox") == "workspace-write":
|
|
166
|
+
network_override = "sandbox_workspace_write.network_access=true"
|
|
167
|
+
if network_override not in overrides:
|
|
168
|
+
overrides.append(network_override)
|
|
21
169
|
# Studio's default collaboration mode must expose Codex's structured
|
|
22
170
|
# request_user_input tool; the upstream feature is intentionally off by
|
|
23
171
|
# default outside Plan mode. This stays process-local to the isolated
|
|
@@ -60,9 +208,16 @@ def _create_codex(context: RuntimeLaunchContext) -> RuntimeAdapter:
|
|
|
60
208
|
if overrides:
|
|
61
209
|
_apply_codex_overrides(client, overrides)
|
|
62
210
|
timeout = context.config.get("turn_timeout_seconds")
|
|
211
|
+
request_defaults = kernel_start_request_defaults(context)
|
|
212
|
+
request_config = request_defaults.get("config") or {}
|
|
213
|
+
sandbox_read_only = (
|
|
214
|
+
bool(context.config["sandbox_read_only"])
|
|
215
|
+
if "sandbox_read_only" in context.config
|
|
216
|
+
else bool(request_config.get("sandbox_read_only", True))
|
|
217
|
+
)
|
|
63
218
|
return CodexRuntimeAdapter(
|
|
64
219
|
client,
|
|
65
|
-
sandbox_read_only=
|
|
220
|
+
sandbox_read_only=sandbox_read_only,
|
|
66
221
|
turn_timeout_seconds=float(timeout) if timeout is not None else None,
|
|
67
222
|
)
|
|
68
223
|
|
|
@@ -76,10 +231,36 @@ def _isolated_codex_home(project_dir: Any) -> Path:
|
|
|
76
231
|
"""
|
|
77
232
|
override = os.environ.get("KSADK_CODEX_HOME")
|
|
78
233
|
if override:
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
234
|
+
home = Path(override).expanduser()
|
|
235
|
+
home.mkdir(parents=True, exist_ok=True)
|
|
236
|
+
return home
|
|
237
|
+
|
|
238
|
+
# Source bundles are deliberately mounted read-only in managed runtimes.
|
|
239
|
+
# Keep the preferred workspace-local isolation for local development, but
|
|
240
|
+
# never make a Codex turn depend on being able to mutate that bundle.
|
|
241
|
+
workspace_home = Path(str(project_dir)) / ".agentkit" / "codex-home"
|
|
242
|
+
try:
|
|
243
|
+
workspace_home.mkdir(parents=True, exist_ok=True)
|
|
244
|
+
return workspace_home
|
|
245
|
+
except OSError:
|
|
246
|
+
pass
|
|
247
|
+
|
|
248
|
+
# The managed runtime already provides a per-workload writable state
|
|
249
|
+
# volume. Derive from its explicit directory first, then from the
|
|
250
|
+
# session-store path for backward-compatible images. /tmp is a final
|
|
251
|
+
# process-local fallback for custom read-only launchers.
|
|
252
|
+
state_dir = os.environ.get("KSADK_RUNTIME_STATE_DIR")
|
|
253
|
+
session_path = os.environ.get("KSADK_SESSION_PATH")
|
|
254
|
+
fallback_root = (
|
|
255
|
+
Path(state_dir)
|
|
256
|
+
if state_dir
|
|
257
|
+
else Path(session_path).expanduser().parent
|
|
258
|
+
if session_path
|
|
259
|
+
else Path(tempfile.gettempdir()) / "ksadk-runtime-state"
|
|
260
|
+
)
|
|
261
|
+
fallback_home = fallback_root / "codex-home"
|
|
262
|
+
fallback_home.mkdir(parents=True, exist_ok=True)
|
|
263
|
+
return fallback_home
|
|
83
264
|
|
|
84
265
|
|
|
85
266
|
def _apply_codex_overrides(client: Any, overrides: Any) -> None:
|
|
@@ -153,4 +334,9 @@ def create_runtime_adapter(context: RuntimeLaunchContext) -> RuntimeAdapter:
|
|
|
153
334
|
return build_default_runtime_registry().create(context)
|
|
154
335
|
|
|
155
336
|
|
|
156
|
-
__all__ = [
|
|
337
|
+
__all__ = [
|
|
338
|
+
"apply_runtime_start_request_defaults",
|
|
339
|
+
"build_default_runtime_registry",
|
|
340
|
+
"create_runtime_adapter",
|
|
341
|
+
"kernel_start_request_defaults",
|
|
342
|
+
]
|