agentengine-sdk-python 0.8.2__py3-none-any.whl → 0.8.4__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.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/METADATA +22 -28
- agentengine_sdk_python-0.8.4.dist-info/RECORD +1070 -0
- ksadk/_build_provenance.json +1 -0
- ksadk/agui/_agent_helpers.py +4 -0
- ksadk/api/client.py +108 -91
- ksadk/builders/code_builder.py +36 -9
- ksadk/builders/framework_requirements.py +2 -1
- ksadk/builders/ks3_uploader.py +36 -7
- ksadk/builders/managed_runtime_builder.py +4 -0
- ksadk/cli/__init__.py +38 -3
- ksadk/cli/cmd_managed_runtime.py +13 -1
- ksadk/cli/cmd_plugin.py +662 -0
- ksadk/cli/cmd_web.py +2 -5
- ksadk/cli/runtime_bootstrap.py +23 -1
- ksadk/codex/client.py +424 -96
- ksadk/codex/projection.py +24 -0
- ksadk/codex/runtime.py +83 -283
- ksadk/common/auth.py +16 -10
- ksadk/configs/env_registry.py +59 -3
- ksadk/configs/settings.py +9 -0
- ksadk/context_engine/contributors.py +73 -8
- ksadk/conversations/__init__.py +19 -0
- ksadk/conversations/context.py +104 -24
- ksadk/conversations/contracts.py +266 -0
- ksadk/conversations/message_projection.py +154 -15
- ksadk/conversations/projector.py +614 -0
- ksadk/conversations/reducer.py +98 -0
- ksadk/conversations/runtime_invocation.py +5 -0
- ksadk/conversations/runtime_payloads.py +1 -0
- ksadk/conversations/runtime_preparation.py +30 -27
- ksadk/conversations/runtime_resume.py +50 -2
- ksadk/conversations/runtime_stream_events.py +5 -0
- ksadk/conversations/runtime_streaming.py +25 -7
- ksadk/deployment/env_forward.py +2 -2
- ksadk/deployment/providers/serverless.py +1 -1
- ksadk/events/_v1_compat/projection.py +2 -0
- ksadk/events/adapters/_codex_validators.py +18 -7
- ksadk/events/adapters/codex.py +190 -0
- ksadk/events/adapters/langgraph.py +15 -1
- ksadk/events/canonical_store.py +3 -1
- ksadk/events/projections.py +1 -1
- ksadk/harness/__init__.py +45 -35
- ksadk/harness/config.py +2 -2
- ksadk/harness/runtime.py +75 -16
- ksadk/harness/tools.py +38 -13
- ksadk/interaction/provider.py +1 -0
- ksadk/interaction/providers/langgraph.py +1 -0
- ksadk/kernel/bootstrap.py +28 -4
- ksadk/kernel/contract_fingerprints.py +5 -4
- ksadk/kernel/contracts.py +8 -0
- ksadk/kernel/control.py +1 -0
- ksadk/kernel/ingress.py +36 -2
- ksadk/kernel/memory_store.py +1 -0
- ksadk/kernel/postgres_store.py +1 -0
- ksadk/kernel/sqlite_store.py +28 -0
- ksadk/kernel/store.py +3 -0
- ksadk/kernel/worker.py +76 -10
- ksadk/knowledge_base/client.py +57 -27
- ksadk/mcp_runtime/__init__.py +12 -4
- ksadk/memory/adk/backends/sdk_ltm_backend.py +161 -41
- ksadk/memory/adk/resilient_session_service.py +25 -17
- ksadk/memory/adk/short_term_memory.py +26 -9
- ksadk/memory/models.py +7 -4
- ksadk/memory/provider_resolver.py +3 -0
- ksadk/memory/providers/local_sqlite.py +7 -0
- ksadk/model_proxy/server.py +10 -5
- ksadk/plugins/__init__.py +171 -0
- ksadk/plugins/artifacts.py +275 -0
- ksadk/plugins/bridges/__init__.py +47 -0
- ksadk/plugins/bridges/codex.py +659 -0
- ksadk/plugins/bridges/dsh.py +1300 -0
- ksadk/plugins/builtins.py +746 -0
- ksadk/plugins/bundle.py +246 -0
- ksadk/plugins/bundle_security.py +191 -0
- ksadk/plugins/codex_manifest.py +983 -0
- ksadk/plugins/composition.py +537 -0
- ksadk/plugins/context_contributor.py +437 -0
- ksadk/plugins/contracts.py +569 -0
- ksadk/plugins/delivery.py +153 -0
- ksadk/plugins/dsh_installation_digest.py +71 -0
- ksadk/plugins/dsh_toolchain.py +1024 -0
- ksadk/plugins/ecosystem_bridge.py +1105 -0
- ksadk/plugins/ecosystem_probe.py +191 -0
- ksadk/plugins/host.py +787 -0
- ksadk/plugins/kernel_adapter.py +205 -0
- ksadk/plugins/providers/__init__.py +108 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +53 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +16 -0
- ksadk/plugins/providers/bundles/dsh-memory/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-memory/index.mjs +175 -0
- ksadk/plugins/providers/bundles/dsh-memory/package.json +16 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/client.mjs +166 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/index.mjs +9 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/package.json +12 -0
- ksadk/plugins/providers/bundles/dsh-skill-center/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-skill-center/index.mjs +125 -0
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +16 -0
- ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
- ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +870 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +92 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +15 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
- ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
- ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
- ksadk/plugins/providers/codex.py +988 -0
- ksadk/plugins/providers/codex_dsh.py +83 -0
- ksadk/plugins/providers/codex_native.py +368 -0
- ksadk/plugins/providers/codex_turn.py +301 -0
- ksadk/plugins/providers/dsh.py +951 -0
- ksadk/plugins/providers/dsh_capabilities.py +1389 -0
- ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
- ksadk/plugins/providers/dsh_mcp.py +467 -0
- ksadk/plugins/providers/harness.py +632 -0
- ksadk/plugins/providers/harness_dsh.py +91 -0
- ksadk/plugins/providers/legacy.py +215 -0
- ksadk/plugins/providers/legacy_catalog.py +100 -0
- ksadk/plugins/providers/mcp_projection.py +150 -0
- ksadk/plugins/providers/platform_resources.py +657 -0
- ksadk/plugins/providers/shipped_dsh.py +370 -0
- ksadk/plugins/resolver.py +338 -0
- ksadk/plugins/subagent_providers/__init__.py +12 -0
- ksadk/plugins/subagent_providers/codex.py +443 -0
- ksadk/plugins/subagents.py +333 -0
- ksadk/resource_runtime/__init__.py +4 -0
- ksadk/resource_runtime/broker.py +616 -0
- ksadk/resource_runtime/build_artifacts.py +165 -0
- ksadk/resource_runtime/contracts.py +138 -0
- ksadk/resource_runtime/discovery_receipts.py +100 -0
- ksadk/resource_runtime/discovery_skills.py +172 -0
- ksadk/resource_runtime/errors.py +6 -0
- ksadk/resource_runtime/ipc.py +142 -0
- ksadk/resource_runtime/kernel_approval.py +165 -0
- ksadk/resource_runtime/knowledge.py +114 -0
- ksadk/resource_runtime/langgraph.py +94 -0
- ksadk/resource_runtime/leases.py +191 -0
- ksadk/resource_runtime/managed_projection.py +186 -0
- ksadk/resource_runtime/mcp_server.py +138 -0
- ksadk/resource_runtime/memory_provider.py +318 -0
- ksadk/resource_runtime/memory_receipts.py +34 -0
- ksadk/resource_runtime/operation_ledger.py +211 -0
- ksadk/resource_runtime/plugin_config.py +48 -0
- ksadk/resource_runtime/policy_authorization.py +54 -0
- ksadk/resource_runtime/process.py +110 -0
- ksadk/resource_runtime/skill_artifacts.py +153 -0
- ksadk/resource_runtime/skill_runtime.py +42 -0
- ksadk/resource_runtime/skill_workspace.py +118 -0
- ksadk/resource_runtime/skills.py +215 -0
- ksadk/resource_runtime/snapshots.py +180 -0
- ksadk/resource_runtime/socket_server.py +103 -0
- ksadk/resource_runtime/supervisor.py +380 -0
- ksadk/resource_runtime/worker.py +504 -0
- ksadk/runners/_langgraph_runner_streams.py +74 -6
- ksadk/runners/adk_runner.py +149 -11
- ksadk/runners/base_runner.py +29 -1
- ksadk/runners/langgraph_runner.py +475 -145
- ksadk/runtime/_runner_adapter/stream_mapping.py +193 -60
- ksadk/runtime/adapter.py +3 -0
- ksadk/runtime/conversation_execution.py +92 -16
- ksadk/runtime/executor.py +78 -2
- ksadk/runtime/factory.py +30 -200
- ksadk/runtime/framework_adapters.py +41 -0
- ksadk/runtime/preprocessing.py +10 -2
- ksadk/runtime/runner_adapter.py +78 -14
- ksadk/runtime_context.py +40 -2
- ksadk/sandbox/__init__.py +2 -1
- ksadk/sandbox/backends/e2b.py +52 -11
- ksadk/sandbox/backends/local_process.py +9 -0
- ksadk/sandbox/base.py +2 -0
- ksadk/sandbox/e2b_connection.py +66 -0
- ksadk/sandbox/factory.py +72 -0
- ksadk/scheduler/__init__.py +18 -0
- ksadk/scheduler/calendar.py +102 -0
- ksadk/scheduler/contracts.py +254 -0
- ksadk/scheduler/dispatcher.py +129 -0
- ksadk/scheduler/engine.py +416 -0
- ksadk/scheduler/sqlite_store.py +581 -0
- ksadk/server/composition.py +2 -0
- ksadk/server/factory.py +5 -0
- ksadk/server/persistence_capability.py +516 -0
- ksadk/server/routes/control.py +210 -46
- ksadk/server/routes/dependencies.py +15 -0
- ksadk/server/routes/models.py +47 -4
- ksadk/server/routes/projection.py +252 -12
- ksadk/server/routes/sessions.py +284 -107
- ksadk/server/routes/streaming.py +43 -9
- ksadk/server/static/assets/{ArtifactsPanel-DSU1sWD_.js → ArtifactsPanel-CGbWlMNh.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-DOH6MVcn.js → CodeBlock-b4C7upmO.js} +3 -3
- ksadk/server/static/assets/{MathMessageMarkdown-BL8my1R2.js → MathMessageMarkdown-DbdW5A4_.js} +4 -4
- ksadk/server/static/assets/{MermaidBlock-Dz4IP-Tx.js → MermaidBlock-BEBN4Ksz.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-DUrK0JpZ.js → NativeTerminalPanel-zvL-WpAn.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-g20pFzNV.js → abnfDiagram-VCTEODGH-BYafW7Za.js} +1 -1
- ksadk/server/static/assets/{arc-C4FzinUA.js → arc-bTohInsS.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-DpIqL5h4.js → architectureDiagram-5GKGNRK7-Ch5Lbzsi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-BjkljTNz.js → blockDiagram-NRAW4CY4-kqF4MDOG.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-Dk_ieq2X.js → c4Diagram-UCG6FXSJ-8uSRIODv.js} +1 -1
- ksadk/server/static/assets/channel-CF5Up3hQ.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-BVHAchFb.js → chunk-5VM5RSS4-DkhehZDr.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-C-ipQzuS.js → chunk-F27PBJKO-BdXhtPe9.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-C2EyJbIK.js → chunk-G27WJ6UU-DPTpvpwi.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-vYvVJb_M.js → chunk-JWPE2WC7-Pqoh38el.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-BcI6ysPT.js → chunk-LCL6LL3I-DeU00qC-.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-C030x_Z1.js → chunk-POPQ4Y6H-CzxScFkr.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-yyGpsz4n.js → chunk-RHFEMEQ7-DpqMx-ux.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-BLTlmMU7.js → chunk-SVP7TREG-C6t0SypQ.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-C_32ArgP.js → chunk-XXDRQBXY-DVaeafZk.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-9YQYwdl0.js → cose-bilkent-JH36ORCC-Bf9D3tzJ.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-ErLF5N13.js → cynefinDiagram-5FMLGOSQ-B9cY3iTz.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-DFiQF-6f.js → dagre-3AP2YEHR-CSwlx3CB.js} +1 -1
- ksadk/server/static/assets/{dagre-BuhGnRI1.js → dagre-UBpgon5q.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-Bt1v8-GC.js → diagram-S7CK7UJ4-C9akhN9a.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-DSCxJdBK.js → diagram-UQ7AKVKN-CgedhTPI.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-DHfYwp_9.js → diagram-VSXAHHWV-Cjucz5BY.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-DdzD-4Le.js → diagram-VX7I27RA-Dd4Vleyn.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-Du-nAJ9F.js → diagram-Z3DM3KII-CZ2jGtYW.js} +1 -1
- ksadk/server/static/assets/{dist-B7seoj3d.js → dist-B2_CVgKv.js} +1 -1
- ksadk/server/static/assets/{dist-CSh_DE14.js → dist-B3FR1SKK.js} +1 -1
- ksadk/server/static/assets/{dist-DUX-id_F.js → dist-BIr4DSRq.js} +1 -1
- ksadk/server/static/assets/{dist-C_wsv-Qd.js → dist-BgV_owcB.js} +1 -1
- ksadk/server/static/assets/{dist-W-TIVntx.js → dist-Bj730Ib4.js} +1 -1
- ksadk/server/static/assets/{dist-BytlxIDT.js → dist-BnaTiyzN.js} +1 -1
- ksadk/server/static/assets/{dist-CXYYBw3_.js → dist-C1NMAY5a.js} +1 -1
- ksadk/server/static/assets/{dist-dDdADKFA.js → dist-C5_ZAZsG.js} +1 -1
- ksadk/server/static/assets/{dist-BVDffZ0U.js → dist-CB9iJrvg.js} +1 -1
- ksadk/server/static/assets/{dist-Bf2M8m3N.js → dist-CFzsn6BG.js} +1 -1
- ksadk/server/static/assets/{dist-ngtN0DJB.js → dist-Cf125P_m.js} +1 -1
- ksadk/server/static/assets/{dist-BE7bu-DL.js → dist-ClYUxfeK.js} +1 -1
- ksadk/server/static/assets/{dist-DNp6rLRA.js → dist-DFD6Qa6T.js} +1 -1
- ksadk/server/static/assets/{dist-BX8z72IC.js → dist-DVCOWtha.js} +1 -1
- ksadk/server/static/assets/{dist-dydu68Fl.js → dist-D_ctSS2i.js} +1 -1
- ksadk/server/static/assets/{dist-ClxGviKw.js → dist-DiixqL0J.js} +1 -1
- ksadk/server/static/assets/{dist-BjU6y-A2.js → dist-DoVSwoDb.js} +1 -1
- ksadk/server/static/assets/{dist-Dq9gLD7L.js → dist-DvFK7p5S.js} +1 -1
- ksadk/server/static/assets/{dist-8hqcx0sU.js → dist-QfkEHOlb.js} +1 -1
- ksadk/server/static/assets/{dist-CttYUqzS.js → dist-btbmmX5O.js} +1 -1
- ksadk/server/static/assets/{dist-DmldrHd_.js → dist-fBO2v5Kt.js} +1 -1
- ksadk/server/static/assets/{dist-DnfXs8Vn.js → dist-ufY3F5p6.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Da9C9NO1.js → ebnfDiagram-PWID7BFC-Ci8NqqZu.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-EAGqqR79.js → erDiagram-SSCWMZ5O-CCIOhLZG.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DqJsKb59.js → ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-B6g4dtDi.js → gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js} +1 -1
- ksadk/server/static/assets/index-DcTML1Up.css +2 -0
- ksadk/server/static/assets/index-Dh2XHqPK.js +244 -0
- ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-Djm_nbd5.js → infoDiagram-RXCK75RN-CO0rRTRA.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-DWya9SG2.js → ishikawaDiagram-5VMMS53U-CHiaedSS.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DutxhSNI.js → journeyDiagram-EYS64GPL-CHcCIB09.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-DJdOF8Fm.js → kanban-definition-3QL26DDD-CJ_ebBZf.js} +1 -1
- ksadk/server/static/assets/{katex-vFWytM5c.js → katex-B4weu383.js} +1 -1
- ksadk/server/static/assets/{linear-BHjG8b-J.js → linear-V-MgYHW1.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-KGSy4jWT.js → mermaid-parser.core-CBijEX_c.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-9-HC88D4.js → mindmap-definition-FBJOCRG2-Bc-pQvpp.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-DrEZd4fD.js → pegDiagram-XKGWAZYB-D7genGLl.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-DpjqOFFp.js → pieDiagram-E7YTZNPT-Bxj32zwD.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BiNhgOXX.js → quadrantDiagram-AXDQQJYC-BURv2mGh.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-_Y3Ojg6G.js → railroadDiagram-O6MQD6OU-CCsh3avW.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-DeCFdg9K.js → requirementDiagram-EFPCY7ZU-_FRRBKEd.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-CPH75rhw.js → sankeyDiagram-P5KCCOFB-C-gr2o9M.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-OEpQQdr4.js → sequenceDiagram-WJ2MYXX4-D97NmfKg.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-heUErzhI.js → sizeCapture-X5ZJPWSS-DjrPC5FX.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DvA3jSMB.js → stateDiagram-HBIQ2CUA-DzMNg1hh.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-CR-dfN_t.js → swimlanes-XN3QIQJK-Cssf_CsU.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-DAVJf1TX.js → timeline-definition-24CTP7MA-BWTHzyS1.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-DwM8eDkh.js → vennDiagram-4TSXK5OY-BSKgJsmR.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DZL-Zz2t.js → wardleyDiagram-VM6X3IG4-eflHNoaZ.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js → xychartDiagram-S5SC5T6Z-eYqrQ-v4.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/session_context.py +66 -0
- ksadk/sessions/__init__.py +11 -21
- ksadk/sessions/_local_service_sync.py +263 -1
- ksadk/sessions/base.py +176 -0
- ksadk/sessions/errors.py +4 -0
- ksadk/sessions/in_memory.py +309 -19
- ksadk/sessions/local_service.py +83 -1
- ksadk/sessions/persistence.py +275 -0
- ksadk/sessions/postgres_service.py +358 -0
- ksadk/sessions/resilience.py +8 -0
- ksadk/sessions/resilient.py +362 -4
- ksadk/sessions/topology.py +135 -0
- ksadk/skills/models.py +26 -4
- ksadk/skills/package_store.py +186 -38
- ksadk/skills/runtime/agent.py +31 -6
- ksadk/skills/runtime/artifact_delivery.py +139 -0
- ksadk/skills/runtime/backends/e2b.py +98 -6
- ksadk/skills/runtime/backends/local.py +73 -8
- ksadk/skills/runtime/base.py +3 -0
- ksadk/skills/runtime/executor.py +2 -0
- ksadk/skills/runtime/loader.py +10 -2
- ksadk/skills/runtime/pinned.py +114 -0
- ksadk/skills/runtime/request.py +31 -0
- ksadk/skills/service_client.py +211 -24
- ksadk/studio/agent_lifecycle.py +26 -20
- ksadk/studio/api.py +714 -90
- ksadk/studio/api_catalog_routes.py +23 -0
- ksadk/studio/api_contracts.py +34 -1
- ksadk/studio/api_plugin_routes.py +911 -0
- ksadk/studio/api_resource_connections.py +183 -0
- ksadk/studio/attachment_store.py +187 -0
- ksadk/studio/authoring.py +10 -4
- ksadk/studio/authoring_coordinator.py +31 -16
- ksadk/studio/builder.py +199 -43
- ksadk/studio/cloud.py +346 -104
- ksadk/studio/cloud_shared_web.py +565 -0
- ksadk/studio/codex_agent_service.py +140 -27
- ksadk/studio/codex_builder.py +294 -16
- ksadk/studio/codex_credentials.py +90 -0
- ksadk/studio/codex_manifest.py +51 -4
- ksadk/studio/codex_plugin_store.py +746 -0
- ksadk/studio/codex_provider_build.py +231 -0
- ksadk/studio/codex_run.py +200 -29
- ksadk/studio/compatibility_report.py +456 -0
- ksadk/studio/compiler.py +84 -15
- ksadk/studio/contracts.py +249 -4
- ksadk/studio/dsh_application.py +137 -0
- ksadk/studio/dsh_capability_service.py +1107 -0
- ksadk/studio/dsh_models.py +59 -0
- ksadk/studio/dsh_provider_registration.py +1075 -0
- ksadk/studio/event_store.py +54 -6
- ksadk/studio/framework_run.py +37 -4
- ksadk/studio/hosted_kernel.py +89 -14
- ksadk/studio/mcp_runtime.py +11 -3
- ksadk/studio/model_client.py +2 -2
- ksadk/studio/operations.py +12 -2
- ksadk/studio/plugin_composition.py +468 -0
- ksadk/studio/plugin_kernel_adapter.py +28 -0
- ksadk/studio/plugin_runtime.py +831 -0
- ksadk/studio/resource_authority.py +637 -0
- ksadk/studio/resource_binding_validation.py +77 -0
- ksadk/studio/resource_build_admission.py +196 -0
- ksadk/studio/resource_build_materializer.py +149 -0
- ksadk/studio/resource_catalog.py +149 -3
- ksadk/studio/resource_connections.py +220 -0
- ksadk/studio/run_service.py +1144 -96
- ksadk/studio/runtime_source.py +24 -8
- ksadk/studio/scheduler_assistant.py +317 -0
- ksadk/studio/scheduler_runtime.py +383 -0
- ksadk/studio/scheduler_service.py +214 -0
- ksadk/studio/service.py +1131 -95
- ksadk/studio/shared_web.py +610 -87
- ksadk/studio/soul.py +52 -0
- ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +41 -0
- ksadk/studio/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- ksadk/studio/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--BEOyPC3w.css +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +44 -0
- ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +3 -0
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +1 -0
- ksadk/studio/static/assets/arc-Pry-7G1_.js +1 -0
- ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +1 -0
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +36 -0
- ksadk/studio/static/assets/array-BifhSqXX.js +1 -0
- ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CFmPl1de.js +129 -0
- ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BRrGu8qt.js +38 -0
- ksadk/studio/static/assets/channel-BqO-gtEw.js +1 -0
- ksadk/studio/static/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- ksadk/studio/static/assets/chunk-4HAMMTFA-D220vUtq.js +62 -0
- ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +2 -0
- ksadk/studio/static/assets/chunk-DU6HZSFF-C4DtVpCu.js +128 -0
- ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +1 -0
- ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
- ksadk/studio/static/assets/chunk-GMAD6QVW-DiQA-u2N.js +72 -0
- ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +1 -0
- ksadk/studio/static/assets/chunk-IMKFNOWR-BSlbjT_b.js +231 -0
- ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +1 -0
- ksadk/studio/static/assets/chunk-OSK3NFVY-M2m6G3j4.js +10 -0
- ksadk/studio/static/assets/chunk-P2QGCYS3-DezaQxiK.js +1 -0
- ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +1 -0
- ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +1 -0
- ksadk/studio/static/assets/chunk-SHT3W25Y-DAyIVp5H.js +168 -0
- ksadk/studio/static/assets/chunk-SVP7TREG-DulomOrS.js +88 -0
- ksadk/studio/static/assets/chunk-TICWLB2K-bHJYoflj.js +206 -0
- ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +1 -0
- ksadk/studio/static/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +1 -0
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +1 -0
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +1 -0
- ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +1 -0
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +62 -0
- ksadk/studio/static/assets/cytoscape.esm-CGd-uY3x.js +321 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +4 -0
- ksadk/studio/static/assets/dagre-PrKaheQc.js +1 -0
- ksadk/studio/static/assets/defaultLocale-BFoDCU3G.js +1 -0
- ksadk/studio/static/assets/diagram-S7CK7UJ4-0BZ98mya.js +30 -0
- ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +41 -0
- ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +3 -0
- ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +24 -0
- ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +24 -0
- ksadk/studio/static/assets/dist-v5Q1xZ2K.js +1 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +1 -0
- ksadk/studio/static/assets/erDiagram-RLTQ6QDP-DLGry2Ap.js +99 -0
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +1 -0
- ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +1 -0
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +292 -0
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +1 -0
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +106 -0
- ksadk/studio/static/assets/graphlib-DS17s2tU.js +1 -0
- ksadk/studio/static/assets/index-CeHL9ARV.css +2 -0
- ksadk/studio/static/assets/index-D9QEcVpL.js +320 -0
- ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +1 -0
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +2 -0
- ksadk/studio/static/assets/init-C-OQMol4.js +1 -0
- ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-CljI2wyf.js +70 -0
- ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-D50Fo2sL.js +139 -0
- ksadk/studio/static/assets/kanban-definition-UXKFOSKX-DimfOTam.js +89 -0
- ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
- ksadk/studio/static/assets/line-CX5BOOUP.js +1 -0
- ksadk/studio/static/assets/linear-BCxN9JLv.js +1 -0
- ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +7 -0
- ksadk/studio/static/assets/mindmap-definition-YA3MSWOX-Bizzqy5R.js +96 -0
- ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
- ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +1 -0
- ksadk/studio/static/assets/path-fybaL0A-.js +1 -0
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +1 -0
- ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +1 -0
- ksadk/studio/static/assets/pieDiagram-E7YTZNPT-B9mrFSDF.js +39 -0
- ksadk/studio/static/assets/quadrantDiagram-AXDQQJYC-NzUfCbMR.js +7 -0
- ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +1 -0
- ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +1 -0
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +1 -0
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +1 -0
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +1 -0
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +1 -0
- ksadk/studio/static/assets/requirementDiagram-BXWQKSXE-BF3d103U.js +84 -0
- ksadk/studio/static/assets/rolldown-runtime-Dy4uBu1J-DK3Fl9T5.js +1 -0
- ksadk/studio/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +40 -0
- ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js +162 -0
- ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- ksadk/studio/static/assets/src-SFn9St9H.js +1 -0
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +1 -0
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +1 -0
- ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +1 -0
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +8 -0
- ksadk/studio/static/assets/timeline-definition-24CTP7MA-DxmSSjRB.js +120 -0
- ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +1 -0
- ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +1 -0
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +34 -0
- ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +1 -0
- ksadk/studio/static/assets/wardleyDiagram-VM6X3IG4-Ba1AOWoe.js +78 -0
- ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js +7 -0
- ksadk/studio/static/index.html +2 -2
- ksadk/studio/validator.py +1 -1
- ksadk/studio/workspace.py +1 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/workspace_files/path_utils.py +41 -0
- agentengine_sdk_python-0.8.2.dist-info/RECORD +0 -778
- ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +0 -1
- ksadk/server/static/assets/channel-4cQHKtx1.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +0 -1
- ksadk/server/static/assets/index-8ipRcQ-M.js +0 -240
- ksadk/server/static/assets/index-ByFCqjlh.css +0 -2
- ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +0 -1
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
- ksadk/studio/static/assets/index-BLpcdrgW.css +0 -1
- ksadk/studio/static/assets/index-CYekR2Xv.js +0 -260
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,831 @@
|
|
|
1
|
+
"""Local Studio execution for immutable PluginHost AgentBundle v2 builds."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import json
|
|
7
|
+
from collections.abc import Mapping, Sequence
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any, cast
|
|
11
|
+
|
|
12
|
+
from ksadk.harness.reasoner import (
|
|
13
|
+
HarnessReasoner,
|
|
14
|
+
HarnessReasoningTurn,
|
|
15
|
+
HarnessToolCall,
|
|
16
|
+
)
|
|
17
|
+
from ksadk.plugins.builtins import (
|
|
18
|
+
builtin_capability_factories,
|
|
19
|
+
builtin_capability_manifests,
|
|
20
|
+
builtin_capability_permissions,
|
|
21
|
+
)
|
|
22
|
+
from ksadk.plugins.bundle import PluginBundleError, PluginBundleResolver, ResolvedPluginBundle
|
|
23
|
+
from ksadk.plugins.contracts import CompositionProfile, PluginManifest
|
|
24
|
+
from ksadk.plugins.host import PluginHost, PluginHostError
|
|
25
|
+
from ksadk.plugins.providers.codex import CodexTurnResult
|
|
26
|
+
from ksadk.plugins.providers.dsh_mcp import (
|
|
27
|
+
DSH_PROFILE_MCP_PLUGIN_ID,
|
|
28
|
+
DshProfileMCPFactory,
|
|
29
|
+
dsh_profile_mcp_manifest,
|
|
30
|
+
)
|
|
31
|
+
from ksadk.plugins.providers.harness import (
|
|
32
|
+
HarnessTurnResult,
|
|
33
|
+
KsADKHarnessProviderFactory,
|
|
34
|
+
)
|
|
35
|
+
from ksadk.plugins.providers.legacy import (
|
|
36
|
+
LegacyBundleAdapter,
|
|
37
|
+
LegacyBundleCompatibilityError,
|
|
38
|
+
LegacyHarnessSource,
|
|
39
|
+
)
|
|
40
|
+
from ksadk.plugins.providers.legacy_catalog import (
|
|
41
|
+
CODEX_AGENT_PROVIDER_PLUGIN_ID,
|
|
42
|
+
KSADK_HARNESS_AGENT_PROVIDER_PLUGIN_ID,
|
|
43
|
+
builtin_agent_provider_manifests,
|
|
44
|
+
legacy_harness_agent_provider_manifest,
|
|
45
|
+
)
|
|
46
|
+
from ksadk.plugins.providers.platform_resources import (
|
|
47
|
+
PLATFORM_RESOURCE_MCP_PLUGIN_ID,
|
|
48
|
+
PLATFORM_RESOURCE_MCP_REF,
|
|
49
|
+
PlatformResourceMCPFactory,
|
|
50
|
+
platform_resource_mcp_manifest,
|
|
51
|
+
)
|
|
52
|
+
from ksadk.plugins.resolver import PluginRegistry
|
|
53
|
+
from ksadk.resource_runtime.policy_authorization import FullAccessResourceWriteAuthorizer
|
|
54
|
+
from ksadk.runtime import RuntimeExecutor, RuntimeLaunchContext
|
|
55
|
+
from ksadk.sessions.base import BaseSessionService
|
|
56
|
+
from ksadk.studio.contracts import (
|
|
57
|
+
BuildRecord,
|
|
58
|
+
NetworkPolicy,
|
|
59
|
+
ResolvedModel,
|
|
60
|
+
)
|
|
61
|
+
from ksadk.studio.errors import StudioError
|
|
62
|
+
from ksadk.studio.model_client import OpenAICompatibleModelClient
|
|
63
|
+
from ksadk.studio.plugin_kernel_adapter import StudioPluginKernelAdapter
|
|
64
|
+
from ksadk.studio.repository import BuildRepository
|
|
65
|
+
from ksadk.studio.run_service import StudioRunSpec
|
|
66
|
+
from ksadk.studio.workspace import Workspace
|
|
67
|
+
from ksadk.tools.gateway import normalize_tool_approval_mode
|
|
68
|
+
|
|
69
|
+
_COMPOSED_RUNTIME_TYPES = frozenset({"harness", "plugin"})
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@dataclass(frozen=True)
|
|
73
|
+
class StudioPluginTurnResult:
|
|
74
|
+
"""Normalized result retained at the Studio/third-party boundary."""
|
|
75
|
+
|
|
76
|
+
output_text: str
|
|
77
|
+
session_id: str
|
|
78
|
+
usage: Mapping[str, Any]
|
|
79
|
+
metadata: Mapping[str, Any]
|
|
80
|
+
raw: Any
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
@dataclass
|
|
84
|
+
class _HostEntry:
|
|
85
|
+
agent_id: str
|
|
86
|
+
bundle: ResolvedPluginBundle
|
|
87
|
+
host: PluginHost
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class _StudioHarnessReasoner:
|
|
91
|
+
"""Bind the Harness loop to the immutable Studio model/network policy."""
|
|
92
|
+
|
|
93
|
+
def __init__(
|
|
94
|
+
self,
|
|
95
|
+
client: OpenAICompatibleModelClient,
|
|
96
|
+
*,
|
|
97
|
+
model: ResolvedModel,
|
|
98
|
+
network_policy: NetworkPolicy,
|
|
99
|
+
timeout_seconds: int,
|
|
100
|
+
max_attempts: int,
|
|
101
|
+
backoff_seconds: float,
|
|
102
|
+
) -> None:
|
|
103
|
+
self._client = client
|
|
104
|
+
self._model = model
|
|
105
|
+
self._network_policy = network_policy
|
|
106
|
+
self._timeout_seconds = timeout_seconds
|
|
107
|
+
self._max_attempts = max_attempts
|
|
108
|
+
self._backoff_seconds = backoff_seconds
|
|
109
|
+
|
|
110
|
+
async def complete(
|
|
111
|
+
self,
|
|
112
|
+
*,
|
|
113
|
+
model: str,
|
|
114
|
+
prompt: str,
|
|
115
|
+
messages: Sequence[dict[str, Any]],
|
|
116
|
+
tools: Sequence[Any],
|
|
117
|
+
) -> HarnessReasoningTurn:
|
|
118
|
+
del prompt
|
|
119
|
+
if model != self._model.model:
|
|
120
|
+
raise PluginHostError(
|
|
121
|
+
"harness_model_not_bound",
|
|
122
|
+
f"Harness requested unbound model {model!r}",
|
|
123
|
+
)
|
|
124
|
+
response = await self._client.complete(
|
|
125
|
+
self._model,
|
|
126
|
+
messages=[dict(message) for message in messages],
|
|
127
|
+
network_policy=self._network_policy,
|
|
128
|
+
timeout_seconds=self._timeout_seconds,
|
|
129
|
+
max_attempts=self._max_attempts,
|
|
130
|
+
backoff_seconds=self._backoff_seconds,
|
|
131
|
+
tools=[dict(tool.openai_schema) for tool in tools],
|
|
132
|
+
allow_empty=bool(tools),
|
|
133
|
+
)
|
|
134
|
+
calls: list[HarnessToolCall] = []
|
|
135
|
+
for call in response.tool_calls:
|
|
136
|
+
try:
|
|
137
|
+
arguments = json.loads(call.arguments or "{}")
|
|
138
|
+
except json.JSONDecodeError as error:
|
|
139
|
+
raise PluginHostError(
|
|
140
|
+
"harness_tool_arguments_invalid",
|
|
141
|
+
f"model emitted invalid arguments for tool {call.name!r}",
|
|
142
|
+
) from error
|
|
143
|
+
if not isinstance(arguments, dict):
|
|
144
|
+
raise PluginHostError(
|
|
145
|
+
"harness_tool_arguments_invalid",
|
|
146
|
+
f"model emitted non-object arguments for tool {call.name!r}",
|
|
147
|
+
)
|
|
148
|
+
calls.append(
|
|
149
|
+
HarnessToolCall(
|
|
150
|
+
call_id=call.id,
|
|
151
|
+
name=call.name,
|
|
152
|
+
arguments=arguments,
|
|
153
|
+
)
|
|
154
|
+
)
|
|
155
|
+
return HarnessReasoningTurn(
|
|
156
|
+
final_text=response.content or None,
|
|
157
|
+
tool_calls=tuple(calls),
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class StudioPluginRuntime:
|
|
162
|
+
"""Resolve, activate, and retain composed providers for Studio sessions."""
|
|
163
|
+
|
|
164
|
+
def __init__(
|
|
165
|
+
self,
|
|
166
|
+
workspace: Workspace,
|
|
167
|
+
*,
|
|
168
|
+
build_repository: BuildRepository,
|
|
169
|
+
session_service: BaseSessionService,
|
|
170
|
+
model_client: OpenAICompatibleModelClient,
|
|
171
|
+
secret_resolver: Any,
|
|
172
|
+
harness_reasoner: HarnessReasoner | None = None,
|
|
173
|
+
provider_manifests: Mapping[str, PluginManifest] | None = None,
|
|
174
|
+
provider_factories: Mapping[str, Any] | None = None,
|
|
175
|
+
legacy_harness_sources: Sequence[LegacyHarnessSource] = (),
|
|
176
|
+
dsh_capability_service: Any | None = None,
|
|
177
|
+
resource_dsh_capability_service: Any | None = None,
|
|
178
|
+
resource_authority: Any | None = None,
|
|
179
|
+
resource_connections: Any | None = None,
|
|
180
|
+
resource_actor_ref: str = "local-user",
|
|
181
|
+
codex_local_launch_resolver: Any = None,
|
|
182
|
+
runtime_executor: RuntimeExecutor | None = None,
|
|
183
|
+
) -> None:
|
|
184
|
+
self.workspace = workspace
|
|
185
|
+
self.builds = build_repository
|
|
186
|
+
self._session_service = session_service
|
|
187
|
+
self._model_client = model_client
|
|
188
|
+
self._secret_resolver = secret_resolver
|
|
189
|
+
self._harness_reasoner = harness_reasoner
|
|
190
|
+
self._provider_manifests = dict(provider_manifests or {})
|
|
191
|
+
self._provider_factories = dict(provider_factories or {})
|
|
192
|
+
self._dsh_capability_service = dsh_capability_service
|
|
193
|
+
self._resource_dsh_capability_service = (
|
|
194
|
+
resource_dsh_capability_service or dsh_capability_service
|
|
195
|
+
)
|
|
196
|
+
self._resource_authority = resource_authority
|
|
197
|
+
self._resource_connections = resource_connections
|
|
198
|
+
self._resource_actor_ref = resource_actor_ref
|
|
199
|
+
self._codex_local_launch_resolver = codex_local_launch_resolver
|
|
200
|
+
self._runtime_executor = runtime_executor
|
|
201
|
+
self._legacy_bundles = LegacyBundleAdapter(legacy_harness_sources)
|
|
202
|
+
self._lock = asyncio.Lock()
|
|
203
|
+
self._hosts: dict[str, _HostEntry] = {}
|
|
204
|
+
self._resource_write_modes: dict[str, str] = {}
|
|
205
|
+
self._admission_open = True
|
|
206
|
+
self._closed = False
|
|
207
|
+
|
|
208
|
+
def replace_provider_registrations(
|
|
209
|
+
self,
|
|
210
|
+
provider_manifests: Mapping[str, PluginManifest],
|
|
211
|
+
provider_factories: Mapping[str, Any],
|
|
212
|
+
) -> None:
|
|
213
|
+
"""Bind one startup snapshot before any provider activation exists."""
|
|
214
|
+
|
|
215
|
+
manifests = dict(provider_manifests)
|
|
216
|
+
factories = dict(provider_factories)
|
|
217
|
+
if manifests.keys() != factories.keys():
|
|
218
|
+
raise ValueError(
|
|
219
|
+
"plugin provider manifests and factories must use the same exact references"
|
|
220
|
+
)
|
|
221
|
+
if self._closed:
|
|
222
|
+
raise RuntimeError("cannot replace provider registrations after runtime close")
|
|
223
|
+
if self._hosts:
|
|
224
|
+
raise RuntimeError("cannot replace provider registrations after activation")
|
|
225
|
+
self._provider_manifests = manifests
|
|
226
|
+
self._provider_factories = factories
|
|
227
|
+
|
|
228
|
+
@property
|
|
229
|
+
def active_activation_count(self) -> int:
|
|
230
|
+
return sum(entry.host.activation_count for entry in self._hosts.values())
|
|
231
|
+
|
|
232
|
+
def resolve(
|
|
233
|
+
self,
|
|
234
|
+
build_id: str,
|
|
235
|
+
*,
|
|
236
|
+
model: str | None = None,
|
|
237
|
+
approval_mode: str | None = None,
|
|
238
|
+
) -> StudioRunSpec:
|
|
239
|
+
build = self.builds.get(build_id)
|
|
240
|
+
runtime_type = build.runtime_type.strip().lower()
|
|
241
|
+
if runtime_type not in _COMPOSED_RUNTIME_TYPES:
|
|
242
|
+
raise StudioError(
|
|
243
|
+
"BUILD_RUNTIME_UNSUPPORTED",
|
|
244
|
+
"Build 不是 PluginHost Harness/Provider Runtime",
|
|
245
|
+
status_code=422,
|
|
246
|
+
details={"buildId": build_id, "runtimeType": runtime_type},
|
|
247
|
+
)
|
|
248
|
+
bundle_root = self._bundle_root(build)
|
|
249
|
+
bundle = self._resolve_bundle(bundle_root)
|
|
250
|
+
self._preflight_bundle(bundle)
|
|
251
|
+
dynamic_dsh_mcp = self._bundle_uses_dynamic_dsh(bundle)
|
|
252
|
+
selected_model = self._select_model(build, model)
|
|
253
|
+
resolved = bundle.resolved_agent_spec
|
|
254
|
+
instructions = resolved.get("instructions")
|
|
255
|
+
instructions = instructions if isinstance(instructions, Mapping) else {}
|
|
256
|
+
provider_id, _provider_version = _parse_plugin_ref(
|
|
257
|
+
bundle.composition.profile.agent_provider.ref
|
|
258
|
+
)
|
|
259
|
+
provider_runtime_type = {
|
|
260
|
+
CODEX_AGENT_PROVIDER_PLUGIN_ID: "codex",
|
|
261
|
+
KSADK_HARNESS_AGENT_PROVIDER_PLUGIN_ID: "harness",
|
|
262
|
+
}.get(provider_id)
|
|
263
|
+
return StudioRunSpec(
|
|
264
|
+
launch_context=RuntimeLaunchContext(
|
|
265
|
+
runtime_type=runtime_type,
|
|
266
|
+
project_dir=bundle_root,
|
|
267
|
+
config={"plugin_bundle_digest": bundle.bundle_digest},
|
|
268
|
+
),
|
|
269
|
+
build_id=build.id,
|
|
270
|
+
agent_id=build.agent_id,
|
|
271
|
+
model=selected_model,
|
|
272
|
+
request_config={
|
|
273
|
+
"agent_system": str(instructions.get("system") or ""),
|
|
274
|
+
"agent_task": str(instructions.get("task") or ""),
|
|
275
|
+
"plugin_bundle_digest": bundle.bundle_digest,
|
|
276
|
+
"dynamic_dsh_mcp": dynamic_dsh_mcp,
|
|
277
|
+
"provider_runtime_adapter": provider_runtime_type is not None,
|
|
278
|
+
"provider_runtime_type": provider_runtime_type or "",
|
|
279
|
+
"provider_ref": bundle.composition.profile.agent_provider.ref,
|
|
280
|
+
**(
|
|
281
|
+
{"tool_approval_mode": normalize_tool_approval_mode(approval_mode)}
|
|
282
|
+
if approval_mode
|
|
283
|
+
else {}
|
|
284
|
+
),
|
|
285
|
+
},
|
|
286
|
+
manifest_sha256=build.resolved_digest,
|
|
287
|
+
plugin_bundle_root=bundle_root,
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
async def execute(
|
|
291
|
+
self,
|
|
292
|
+
spec: StudioRunSpec,
|
|
293
|
+
request: Mapping[str, Any],
|
|
294
|
+
*,
|
|
295
|
+
session_id: str,
|
|
296
|
+
) -> StudioPluginTurnResult:
|
|
297
|
+
if spec.plugin_bundle_root is None:
|
|
298
|
+
raise PluginHostError(
|
|
299
|
+
"plugin_bundle_unavailable", "Studio run has no PluginHost Bundle"
|
|
300
|
+
)
|
|
301
|
+
entry = await self._host_for(spec.plugin_bundle_root)
|
|
302
|
+
if entry.agent_id != spec.agent_id:
|
|
303
|
+
raise PluginHostError(
|
|
304
|
+
"plugin_bundle_agent_mismatch",
|
|
305
|
+
"Studio run Agent does not match its immutable PluginHost Bundle",
|
|
306
|
+
)
|
|
307
|
+
self._resource_write_modes[session_id] = str(
|
|
308
|
+
spec.request_config.get("tool_approval_mode") or ""
|
|
309
|
+
)
|
|
310
|
+
try:
|
|
311
|
+
activation = await entry.host.open_activation(
|
|
312
|
+
entry.bundle,
|
|
313
|
+
activation_key=session_id,
|
|
314
|
+
)
|
|
315
|
+
except BaseException:
|
|
316
|
+
self._resource_write_modes.pop(session_id, None)
|
|
317
|
+
raise
|
|
318
|
+
try:
|
|
319
|
+
raw = await activation.execute(dict(request))
|
|
320
|
+
return _normalize_result(raw, session_id=session_id)
|
|
321
|
+
finally:
|
|
322
|
+
# Dynamic DSH leases are generation-bound. Rebuilding the
|
|
323
|
+
# activation per turn guarantees a restarted sidecar never leaves
|
|
324
|
+
# a session pinned to an expired port or scoped token.
|
|
325
|
+
if self._bundle_uses_dynamic_dsh(entry.bundle):
|
|
326
|
+
try:
|
|
327
|
+
await activation.close()
|
|
328
|
+
finally:
|
|
329
|
+
self._resource_write_modes.pop(session_id, None)
|
|
330
|
+
|
|
331
|
+
def kernel_adapter_provider(self, spec: StudioRunSpec): # type: ignore[no-untyped-def]
|
|
332
|
+
"""Return a lazy, Build-pinned adapter factory for Scheduler Kernel."""
|
|
333
|
+
|
|
334
|
+
if spec.plugin_bundle_root is None:
|
|
335
|
+
raise StudioError(
|
|
336
|
+
"PLUGIN_RUNTIME_UNAVAILABLE",
|
|
337
|
+
"Studio Build 没有 PluginHost Bundle",
|
|
338
|
+
status_code=409,
|
|
339
|
+
)
|
|
340
|
+
return lambda: StudioPluginKernelAdapter(self, spec)
|
|
341
|
+
|
|
342
|
+
async def kernel_adapter(
|
|
343
|
+
self,
|
|
344
|
+
spec: StudioRunSpec,
|
|
345
|
+
*,
|
|
346
|
+
session_id: str,
|
|
347
|
+
) -> Any:
|
|
348
|
+
"""Bind a Scheduler run to the provider-owned activation adapter."""
|
|
349
|
+
|
|
350
|
+
if spec.plugin_bundle_root is None:
|
|
351
|
+
raise StudioError(
|
|
352
|
+
"PLUGIN_RUNTIME_UNAVAILABLE",
|
|
353
|
+
"Studio Build 没有 PluginHost Bundle",
|
|
354
|
+
status_code=409,
|
|
355
|
+
)
|
|
356
|
+
entry = await self._host_for(spec.plugin_bundle_root)
|
|
357
|
+
if entry.agent_id != spec.agent_id:
|
|
358
|
+
raise PluginHostError(
|
|
359
|
+
"plugin_bundle_agent_mismatch",
|
|
360
|
+
"Studio run Agent does not match its immutable PluginHost Bundle",
|
|
361
|
+
)
|
|
362
|
+
self._resource_write_modes[session_id] = str(
|
|
363
|
+
spec.request_config.get("tool_approval_mode") or ""
|
|
364
|
+
)
|
|
365
|
+
try:
|
|
366
|
+
activation = await entry.host.open_activation(
|
|
367
|
+
entry.bundle,
|
|
368
|
+
activation_key=session_id,
|
|
369
|
+
)
|
|
370
|
+
except BaseException:
|
|
371
|
+
self._resource_write_modes.pop(session_id, None)
|
|
372
|
+
raise
|
|
373
|
+
try:
|
|
374
|
+
return await activation.runtime_adapter()
|
|
375
|
+
except BaseException:
|
|
376
|
+
try:
|
|
377
|
+
await activation.close()
|
|
378
|
+
finally:
|
|
379
|
+
self._resource_write_modes.pop(session_id, None)
|
|
380
|
+
raise
|
|
381
|
+
|
|
382
|
+
async def close_session(self, session_id: str) -> None:
|
|
383
|
+
async with self._lock:
|
|
384
|
+
entries = tuple(self._hosts.values())
|
|
385
|
+
try:
|
|
386
|
+
for entry in entries:
|
|
387
|
+
await entry.host.close_activation(session_id)
|
|
388
|
+
finally:
|
|
389
|
+
self._resource_write_modes.pop(session_id, None)
|
|
390
|
+
|
|
391
|
+
async def close_session_if_dynamic(self, spec: StudioRunSpec, session_id: str) -> None:
|
|
392
|
+
if bool(spec.request_config.get("dynamic_dsh_mcp")):
|
|
393
|
+
await self.close_session(session_id)
|
|
394
|
+
|
|
395
|
+
async def suspend_admission(self) -> None:
|
|
396
|
+
"""Stop new activations and drain every currently owned host."""
|
|
397
|
+
|
|
398
|
+
async with self._lock:
|
|
399
|
+
self._admission_open = False
|
|
400
|
+
entries = tuple(self._hosts.values())
|
|
401
|
+
self._hosts.clear()
|
|
402
|
+
cleanup = asyncio.create_task(self._dispose_entries(entries))
|
|
403
|
+
interrupted = False
|
|
404
|
+
while not cleanup.done():
|
|
405
|
+
try:
|
|
406
|
+
await asyncio.shield(cleanup)
|
|
407
|
+
except asyncio.CancelledError:
|
|
408
|
+
interrupted = True
|
|
409
|
+
cleanup.result()
|
|
410
|
+
if interrupted:
|
|
411
|
+
raise asyncio.CancelledError
|
|
412
|
+
|
|
413
|
+
async def resume_admission(self) -> None:
|
|
414
|
+
async with self._lock:
|
|
415
|
+
if self._closed:
|
|
416
|
+
raise PluginHostError(
|
|
417
|
+
"plugin_runtime_closed",
|
|
418
|
+
"Studio plugin runtime is closed",
|
|
419
|
+
)
|
|
420
|
+
self._admission_open = True
|
|
421
|
+
|
|
422
|
+
@staticmethod
|
|
423
|
+
async def _dispose_entries(entries: Sequence[_HostEntry]) -> None:
|
|
424
|
+
if entries:
|
|
425
|
+
results = await asyncio.gather(
|
|
426
|
+
*(entry.host.dispose() for entry in entries),
|
|
427
|
+
return_exceptions=True,
|
|
428
|
+
)
|
|
429
|
+
for result in results:
|
|
430
|
+
if isinstance(result, BaseException):
|
|
431
|
+
raise result
|
|
432
|
+
|
|
433
|
+
async def aclose(self) -> None:
|
|
434
|
+
async with self._lock:
|
|
435
|
+
if self._closed:
|
|
436
|
+
return
|
|
437
|
+
self._closed = True
|
|
438
|
+
self._admission_open = False
|
|
439
|
+
entries = tuple(self._hosts.values())
|
|
440
|
+
self._hosts.clear()
|
|
441
|
+
cleanup = asyncio.create_task(self._dispose_entries(entries))
|
|
442
|
+
interrupted = False
|
|
443
|
+
while not cleanup.done():
|
|
444
|
+
try:
|
|
445
|
+
await asyncio.shield(cleanup)
|
|
446
|
+
except asyncio.CancelledError:
|
|
447
|
+
interrupted = True
|
|
448
|
+
cleanup.result()
|
|
449
|
+
if interrupted:
|
|
450
|
+
raise asyncio.CancelledError
|
|
451
|
+
|
|
452
|
+
async def _host_for(self, bundle_root: Path) -> _HostEntry:
|
|
453
|
+
# Re-resolve every turn. This deliberately rechecks enabled receipts and
|
|
454
|
+
# package digests rather than trusting a previously healthy child.
|
|
455
|
+
bundle = self._resolve_bundle(bundle_root)
|
|
456
|
+
key = bundle.bundle_digest
|
|
457
|
+
async with self._lock:
|
|
458
|
+
if self._closed:
|
|
459
|
+
raise PluginHostError(
|
|
460
|
+
"plugin_runtime_closed",
|
|
461
|
+
"Studio plugin runtime is closed",
|
|
462
|
+
)
|
|
463
|
+
if not self._admission_open:
|
|
464
|
+
raise PluginHostError(
|
|
465
|
+
"plugin_runtime_reconfiguring",
|
|
466
|
+
"Studio plugin runtime is reconfiguring",
|
|
467
|
+
)
|
|
468
|
+
existing = self._hosts.get(key)
|
|
469
|
+
if existing is not None:
|
|
470
|
+
return existing
|
|
471
|
+
|
|
472
|
+
registry, factories, permissions = self._runtime_components(bundle)
|
|
473
|
+
verified = (
|
|
474
|
+
bundle
|
|
475
|
+
if bundle.manifest.bundle_format == "agentkit.bundle/v1"
|
|
476
|
+
else PluginBundleResolver(registry).resolve(bundle_root)
|
|
477
|
+
)
|
|
478
|
+
services: dict[str, Any] = {
|
|
479
|
+
"session_service": self._session_service,
|
|
480
|
+
"runtime_state_root": self.workspace.resolve(".agentkit/plugin-runtime/state"),
|
|
481
|
+
# Providers resolve credential *references* at activation time.
|
|
482
|
+
# The DSH discovery host never receives this service.
|
|
483
|
+
"credential_resolver": self._secret_resolver,
|
|
484
|
+
"codex_local_launch_resolver": self._codex_local_launch_resolver,
|
|
485
|
+
"runtime_executor": self._runtime_executor,
|
|
486
|
+
"dsh_capability_service": self._resource_dsh_capability_service,
|
|
487
|
+
"resource_authority": self._resource_authority,
|
|
488
|
+
"resource_connections": self._resource_connections,
|
|
489
|
+
"resource_actor_ref": self._resource_actor_ref,
|
|
490
|
+
"resource_write_authorizer_factory": self._resource_write_authorizer,
|
|
491
|
+
}
|
|
492
|
+
provider_id, _provider_version = _parse_plugin_ref(
|
|
493
|
+
verified.composition.profile.agent_provider.ref
|
|
494
|
+
)
|
|
495
|
+
if provider_id == KSADK_HARNESS_AGENT_PROVIDER_PLUGIN_ID:
|
|
496
|
+
services["harness_reasoner"] = (
|
|
497
|
+
self._harness_reasoner or self._bound_harness_reasoner(verified)
|
|
498
|
+
)
|
|
499
|
+
host = PluginHost(
|
|
500
|
+
registry,
|
|
501
|
+
factories,
|
|
502
|
+
allowed_permissions=permissions,
|
|
503
|
+
services=services,
|
|
504
|
+
)
|
|
505
|
+
try:
|
|
506
|
+
await host.apply(verified.composition.profile)
|
|
507
|
+
except BaseException:
|
|
508
|
+
await host.dispose()
|
|
509
|
+
raise
|
|
510
|
+
candidate = _HostEntry(
|
|
511
|
+
agent_id=verified.manifest.agent_id,
|
|
512
|
+
bundle=verified,
|
|
513
|
+
host=host,
|
|
514
|
+
)
|
|
515
|
+
stale = [
|
|
516
|
+
(digest, entry)
|
|
517
|
+
for digest, entry in self._hosts.items()
|
|
518
|
+
if entry.agent_id == candidate.agent_id and digest != key
|
|
519
|
+
]
|
|
520
|
+
self._hosts[key] = candidate
|
|
521
|
+
for digest, entry in stale:
|
|
522
|
+
self._hosts.pop(digest, None)
|
|
523
|
+
await entry.host.dispose()
|
|
524
|
+
return candidate
|
|
525
|
+
|
|
526
|
+
def _resource_write_authorizer(
|
|
527
|
+
self,
|
|
528
|
+
activation_key: str,
|
|
529
|
+
_bundle: ResolvedPluginBundle,
|
|
530
|
+
) -> FullAccessResourceWriteAuthorizer | None:
|
|
531
|
+
if self._resource_write_modes.get(activation_key) != "full":
|
|
532
|
+
return None
|
|
533
|
+
return FullAccessResourceWriteAuthorizer(activation_key=activation_key)
|
|
534
|
+
|
|
535
|
+
@staticmethod
|
|
536
|
+
def _bundle_uses_dynamic_dsh(bundle: ResolvedPluginBundle) -> bool:
|
|
537
|
+
reference = (
|
|
538
|
+
f"plugin://{DSH_PROFILE_MCP_PLUGIN_ID}@{dsh_profile_mcp_manifest().metadata.version}"
|
|
539
|
+
)
|
|
540
|
+
dynamic_refs = {reference, PLATFORM_RESOURCE_MCP_REF}
|
|
541
|
+
return any(
|
|
542
|
+
capability.ref in dynamic_refs
|
|
543
|
+
for capability in bundle.composition.profile.capabilities
|
|
544
|
+
)
|
|
545
|
+
|
|
546
|
+
def _resolve_bundle(self, bundle_root: Path) -> ResolvedPluginBundle:
|
|
547
|
+
registered_ids = {manifest.metadata.id for manifest in self._provider_manifests.values()}
|
|
548
|
+
try:
|
|
549
|
+
manifest, selection = self._legacy_bundles.select_from_bundle(
|
|
550
|
+
bundle_root,
|
|
551
|
+
registered_provider_ids=registered_ids,
|
|
552
|
+
)
|
|
553
|
+
except LegacyBundleCompatibilityError as error:
|
|
554
|
+
code = (
|
|
555
|
+
"AGENT_PROVIDER_NOT_REGISTERED"
|
|
556
|
+
if error.code == "agent_provider_not_registered"
|
|
557
|
+
else "PLUGIN_BUNDLE_INVALID"
|
|
558
|
+
)
|
|
559
|
+
raise StudioError(
|
|
560
|
+
code,
|
|
561
|
+
"Harness Bundle 兼容性校验失败",
|
|
562
|
+
status_code=409,
|
|
563
|
+
details={"reason": error.code},
|
|
564
|
+
) from error
|
|
565
|
+
if selection is not None and selection.route == "legacy":
|
|
566
|
+
assert selection.manifest is not None
|
|
567
|
+
profile = CompositionProfile.model_validate(
|
|
568
|
+
{
|
|
569
|
+
"agentProvider": {
|
|
570
|
+
"ref": (
|
|
571
|
+
f"plugin://{selection.manifest.metadata.id}"
|
|
572
|
+
f"@{selection.manifest.metadata.version}"
|
|
573
|
+
)
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
)
|
|
577
|
+
registry = PluginRegistry([selection.manifest, *builtin_capability_manifests()])
|
|
578
|
+
try:
|
|
579
|
+
resolved = json.loads(
|
|
580
|
+
(bundle_root / "resolved-agent-spec.json").read_text(encoding="utf-8")
|
|
581
|
+
)
|
|
582
|
+
except (OSError, UnicodeError, json.JSONDecodeError) as error:
|
|
583
|
+
raise StudioError(
|
|
584
|
+
"PLUGIN_BUNDLE_INVALID",
|
|
585
|
+
"Legacy Harness Bundle 缺少 resolved Agent spec",
|
|
586
|
+
status_code=409,
|
|
587
|
+
details={"reason": "legacy_resolved_spec_invalid"},
|
|
588
|
+
) from error
|
|
589
|
+
if not isinstance(resolved, dict):
|
|
590
|
+
raise StudioError(
|
|
591
|
+
"PLUGIN_BUNDLE_INVALID",
|
|
592
|
+
"Legacy Harness resolved Agent spec 必须是对象",
|
|
593
|
+
status_code=409,
|
|
594
|
+
details={"reason": "legacy_resolved_spec_invalid"},
|
|
595
|
+
)
|
|
596
|
+
return ResolvedPluginBundle(
|
|
597
|
+
root=bundle_root,
|
|
598
|
+
manifest=manifest,
|
|
599
|
+
resolved_agent_spec=resolved,
|
|
600
|
+
composition=registry.resolve(profile),
|
|
601
|
+
)
|
|
602
|
+
profile = self._read_profile(bundle_root)
|
|
603
|
+
manifests = [
|
|
604
|
+
*builtin_agent_provider_manifests(),
|
|
605
|
+
*builtin_capability_manifests(),
|
|
606
|
+
dsh_profile_mcp_manifest(),
|
|
607
|
+
platform_resource_mcp_manifest(),
|
|
608
|
+
]
|
|
609
|
+
external = self._external_manifest(profile)
|
|
610
|
+
if external is not None:
|
|
611
|
+
manifests.append(external)
|
|
612
|
+
try:
|
|
613
|
+
return PluginBundleResolver(PluginRegistry(manifests)).resolve(bundle_root)
|
|
614
|
+
except PluginBundleError as error:
|
|
615
|
+
raise StudioError(
|
|
616
|
+
"PLUGIN_BUNDLE_INVALID",
|
|
617
|
+
"PluginHost Bundle 校验失败",
|
|
618
|
+
status_code=409,
|
|
619
|
+
details={"reason": error.code},
|
|
620
|
+
) from error
|
|
621
|
+
|
|
622
|
+
def _runtime_components(
|
|
623
|
+
self,
|
|
624
|
+
bundle: ResolvedPluginBundle,
|
|
625
|
+
) -> tuple[PluginRegistry, dict[str, Any], frozenset[str]]:
|
|
626
|
+
manifests: list[PluginManifest] = [
|
|
627
|
+
*builtin_agent_provider_manifests(),
|
|
628
|
+
*builtin_capability_manifests(),
|
|
629
|
+
dsh_profile_mcp_manifest(),
|
|
630
|
+
platform_resource_mcp_manifest(),
|
|
631
|
+
]
|
|
632
|
+
factories = builtin_capability_factories(
|
|
633
|
+
state_root=self.workspace.resolve(".agentkit/plugin-runtime/state"),
|
|
634
|
+
secret_resolver=self._secret_resolver.resolve,
|
|
635
|
+
)
|
|
636
|
+
factories[DSH_PROFILE_MCP_PLUGIN_ID] = DshProfileMCPFactory(self._dsh_capability_service)
|
|
637
|
+
factories[PLATFORM_RESOURCE_MCP_PLUGIN_ID] = PlatformResourceMCPFactory()
|
|
638
|
+
provider_id, provider_version = _parse_plugin_ref(
|
|
639
|
+
bundle.composition.profile.agent_provider.ref
|
|
640
|
+
)
|
|
641
|
+
provider_ref = f"plugin://{provider_id}@{provider_version}"
|
|
642
|
+
if bundle.manifest.bundle_format == "agentkit.bundle/v1":
|
|
643
|
+
manifest = legacy_harness_agent_provider_manifest()
|
|
644
|
+
factory = KsADKHarnessProviderFactory(session_service=self._session_service)
|
|
645
|
+
else:
|
|
646
|
+
manifest = self._provider_manifests.get(provider_ref)
|
|
647
|
+
factory = self._provider_factories.get(provider_ref)
|
|
648
|
+
if manifest is None or factory is None:
|
|
649
|
+
raise StudioError(
|
|
650
|
+
"AGENT_PROVIDER_NOT_REGISTERED",
|
|
651
|
+
"AgentProvider 尚未由当前 DSH Profile 完成预检与注册",
|
|
652
|
+
status_code=409,
|
|
653
|
+
details={"provider": provider_ref},
|
|
654
|
+
)
|
|
655
|
+
manifests.append(manifest)
|
|
656
|
+
factories[provider_id] = factory
|
|
657
|
+
|
|
658
|
+
allowed = set(builtin_capability_permissions(bundle.composition.profile))
|
|
659
|
+
builtin_ids = {
|
|
660
|
+
manifest.metadata.id
|
|
661
|
+
for manifest in (
|
|
662
|
+
*builtin_agent_provider_manifests(),
|
|
663
|
+
*builtin_capability_manifests(),
|
|
664
|
+
dsh_profile_mcp_manifest(),
|
|
665
|
+
platform_resource_mcp_manifest(),
|
|
666
|
+
)
|
|
667
|
+
}
|
|
668
|
+
builtin_ids.discard(DSH_PROFILE_MCP_PLUGIN_ID)
|
|
669
|
+
allowed.update(
|
|
670
|
+
permission
|
|
671
|
+
for manifest in manifests
|
|
672
|
+
if manifest.metadata.id in builtin_ids
|
|
673
|
+
for permission in manifest.spec.permissions
|
|
674
|
+
)
|
|
675
|
+
security = bundle.resolved_agent_spec.get("security")
|
|
676
|
+
if isinstance(security, Mapping):
|
|
677
|
+
raw = security.get("allowedPermissions") or security.get("allowed_permissions") or []
|
|
678
|
+
if isinstance(raw, Sequence) and not isinstance(raw, (str, bytes)):
|
|
679
|
+
allowed.update(str(item) for item in raw)
|
|
680
|
+
return PluginRegistry(manifests), factories, frozenset(allowed)
|
|
681
|
+
|
|
682
|
+
def _preflight_bundle(self, bundle: ResolvedPluginBundle) -> None:
|
|
683
|
+
"""Reject an unusable composition before a Run or Schedule is admitted.
|
|
684
|
+
|
|
685
|
+
Provider activation is intentionally lazy, but permission and graph
|
|
686
|
+
admission are deterministic from the immutable Bundle. Delaying this
|
|
687
|
+
check until ``RuntimeAdapter.start`` lets an accepted Inbox message
|
|
688
|
+
repeatedly create PENDING Runs that can never become runnable.
|
|
689
|
+
"""
|
|
690
|
+
|
|
691
|
+
registry, factories, permissions = self._runtime_components(bundle)
|
|
692
|
+
host = PluginHost(
|
|
693
|
+
registry,
|
|
694
|
+
factories,
|
|
695
|
+
allowed_permissions=permissions,
|
|
696
|
+
)
|
|
697
|
+
try:
|
|
698
|
+
host.preflight(bundle.composition.profile)
|
|
699
|
+
except PluginHostError as error:
|
|
700
|
+
code = (
|
|
701
|
+
"PLUGIN_PERMISSION_DENIED"
|
|
702
|
+
if error.code == "plugin_permission_denied"
|
|
703
|
+
else "PLUGIN_RUNTIME_PREFLIGHT_FAILED"
|
|
704
|
+
)
|
|
705
|
+
raise StudioError(
|
|
706
|
+
code,
|
|
707
|
+
"Agent 插件组合未通过运行前检查",
|
|
708
|
+
status_code=409,
|
|
709
|
+
details={"reason": error.code},
|
|
710
|
+
) from error
|
|
711
|
+
|
|
712
|
+
def _bound_harness_reasoner(self, bundle: ResolvedPluginBundle) -> HarnessReasoner:
|
|
713
|
+
spec = bundle.resolved_agent_spec
|
|
714
|
+
model = ResolvedModel.model_validate(spec.get("model"))
|
|
715
|
+
security = spec.get("security")
|
|
716
|
+
security = security if isinstance(security, Mapping) else {}
|
|
717
|
+
network = NetworkPolicy.model_validate(security.get("network") or {})
|
|
718
|
+
execution = spec.get("execution")
|
|
719
|
+
execution = execution if isinstance(execution, Mapping) else {}
|
|
720
|
+
retry = execution.get("retry")
|
|
721
|
+
retry = retry if isinstance(retry, Mapping) else {}
|
|
722
|
+
return _StudioHarnessReasoner(
|
|
723
|
+
self._model_client,
|
|
724
|
+
model=model,
|
|
725
|
+
network_policy=network,
|
|
726
|
+
timeout_seconds=int(
|
|
727
|
+
execution.get("timeoutSeconds") or execution.get("timeout_seconds") or 120
|
|
728
|
+
),
|
|
729
|
+
max_attempts=int(retry.get("maxAttempts") or retry.get("max_attempts") or 2),
|
|
730
|
+
backoff_seconds=float(retry.get("backoffSeconds") or retry.get("backoff_seconds") or 1),
|
|
731
|
+
)
|
|
732
|
+
|
|
733
|
+
def _external_manifest(self, profile: CompositionProfile) -> PluginManifest | None:
|
|
734
|
+
plugin_id, version = _parse_plugin_ref(profile.agent_provider.ref)
|
|
735
|
+
builtin_ids = {manifest.metadata.id for manifest in builtin_agent_provider_manifests()}
|
|
736
|
+
if plugin_id in builtin_ids:
|
|
737
|
+
return None
|
|
738
|
+
provider_ref = f"plugin://{plugin_id}@{version}"
|
|
739
|
+
manifest = self._provider_manifests.get(provider_ref)
|
|
740
|
+
if manifest is None:
|
|
741
|
+
raise StudioError(
|
|
742
|
+
"AGENT_PROVIDER_NOT_REGISTERED",
|
|
743
|
+
"AgentProvider 尚未由当前 DSH Profile 完成预检与注册",
|
|
744
|
+
status_code=409,
|
|
745
|
+
details={"provider": provider_ref},
|
|
746
|
+
)
|
|
747
|
+
return manifest
|
|
748
|
+
|
|
749
|
+
def _read_profile(self, bundle_root: Path) -> CompositionProfile:
|
|
750
|
+
try:
|
|
751
|
+
return cast(
|
|
752
|
+
CompositionProfile,
|
|
753
|
+
CompositionProfile.model_validate_json(
|
|
754
|
+
(bundle_root / "composition-profile.json").read_text(encoding="utf-8")
|
|
755
|
+
),
|
|
756
|
+
)
|
|
757
|
+
except (OSError, UnicodeError, ValueError) as error:
|
|
758
|
+
raise StudioError(
|
|
759
|
+
"PLUGIN_BUNDLE_INVALID",
|
|
760
|
+
"PluginHost Bundle 缺少有效的 Composition Profile",
|
|
761
|
+
status_code=409,
|
|
762
|
+
) from error
|
|
763
|
+
|
|
764
|
+
def _bundle_root(self, build: BuildRecord) -> Path:
|
|
765
|
+
if not build.artifact_path:
|
|
766
|
+
raise StudioError("BUILD_NOT_READY", "Build 尚未生成制品", status_code=409)
|
|
767
|
+
archive = cast(
|
|
768
|
+
Path,
|
|
769
|
+
self.workspace.resolve(build.artifact_path, must_exist=True),
|
|
770
|
+
)
|
|
771
|
+
bundle_root = archive.parent / "agent-bundle"
|
|
772
|
+
if not bundle_root.is_dir():
|
|
773
|
+
raise StudioError(
|
|
774
|
+
"PLUGIN_BUNDLE_UNAVAILABLE",
|
|
775
|
+
"Build 缺少可运行的 PluginHost Bundle",
|
|
776
|
+
status_code=409,
|
|
777
|
+
)
|
|
778
|
+
return bundle_root
|
|
779
|
+
|
|
780
|
+
@staticmethod
|
|
781
|
+
def _select_model(build: BuildRecord, requested: str | None) -> str:
|
|
782
|
+
allowed = [str(item) for item in build.runtime_lock.get("models") or [] if str(item)]
|
|
783
|
+
default = str(build.runtime_lock.get("model") or "").strip()
|
|
784
|
+
if default and default not in allowed:
|
|
785
|
+
allowed.insert(0, default)
|
|
786
|
+
selected = str(requested or default).strip()
|
|
787
|
+
if not selected:
|
|
788
|
+
raise StudioError("AGENT_MODEL_REQUIRED", "Build 没有绑定可运行模型", status_code=422)
|
|
789
|
+
if allowed and selected not in allowed:
|
|
790
|
+
raise StudioError(
|
|
791
|
+
"MODEL_NOT_BOUND",
|
|
792
|
+
"请求模型未绑定到当前 Agent Build",
|
|
793
|
+
status_code=422,
|
|
794
|
+
details={"model": selected, "allowedModels": allowed},
|
|
795
|
+
)
|
|
796
|
+
return selected
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
def _parse_plugin_ref(value: str) -> tuple[str, str]:
|
|
800
|
+
plugin_id, version = value.removeprefix("plugin://").rsplit("@", 1)
|
|
801
|
+
return plugin_id, version
|
|
802
|
+
|
|
803
|
+
|
|
804
|
+
def _normalize_result(raw: Any, *, session_id: str) -> StudioPluginTurnResult:
|
|
805
|
+
if isinstance(raw, (CodexTurnResult, HarnessTurnResult)):
|
|
806
|
+
return StudioPluginTurnResult(
|
|
807
|
+
output_text=raw.output_text,
|
|
808
|
+
session_id=raw.session_id,
|
|
809
|
+
usage=dict(raw.usage),
|
|
810
|
+
metadata=dict(raw.metadata),
|
|
811
|
+
raw=raw,
|
|
812
|
+
)
|
|
813
|
+
if not isinstance(raw, Mapping):
|
|
814
|
+
raise PluginHostError("provider_result_invalid", "AgentProvider result must be an object")
|
|
815
|
+
output_text = str(raw.get("outputText") or raw.get("output_text") or raw.get("output") or "")
|
|
816
|
+
if not output_text:
|
|
817
|
+
raise PluginHostError(
|
|
818
|
+
"provider_result_invalid", "AgentProvider result must contain outputText"
|
|
819
|
+
)
|
|
820
|
+
usage = raw.get("usage") if isinstance(raw.get("usage"), Mapping) else {}
|
|
821
|
+
metadata = raw.get("metadata") if isinstance(raw.get("metadata"), Mapping) else {}
|
|
822
|
+
return StudioPluginTurnResult(
|
|
823
|
+
output_text=output_text,
|
|
824
|
+
session_id=str(raw.get("sessionId") or raw.get("session_id") or session_id),
|
|
825
|
+
usage=dict(usage),
|
|
826
|
+
metadata=dict(metadata),
|
|
827
|
+
raw=raw,
|
|
828
|
+
)
|
|
829
|
+
|
|
830
|
+
|
|
831
|
+
__all__ = ["StudioPluginRuntime", "StudioPluginTurnResult"]
|