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,632 @@
|
|
|
1
|
+
"""KsADK Harness AgentProvider backed by the canonical RuntimeExecutor.
|
|
2
|
+
|
|
3
|
+
The provider composes locked MCP, Skill, and Context capabilities, then
|
|
4
|
+
delegates every turn to ``HarnessRuntimeAdapter`` through
|
|
5
|
+
``invoke_runtime_conversation_once``. RuntimeEvent persistence and Session
|
|
6
|
+
history therefore stay on the existing conversation pipeline; this module does
|
|
7
|
+
not create another event stream or transcript store.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import asyncio
|
|
13
|
+
import json
|
|
14
|
+
from collections.abc import Awaitable, Mapping, Sequence
|
|
15
|
+
from contextlib import AsyncExitStack
|
|
16
|
+
from dataclasses import dataclass, replace
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Any, Protocol, cast, runtime_checkable
|
|
19
|
+
|
|
20
|
+
from ksadk.harness.config import HarnessConfig, McpToolSpec, SandboxPolicy
|
|
21
|
+
from ksadk.harness.reasoner import HarnessReasoner, LiteLLMHarnessReasoner
|
|
22
|
+
from ksadk.harness.runtime import HarnessRuntimeAdapter
|
|
23
|
+
from ksadk.plugins.bundle import ResolvedPluginBundle
|
|
24
|
+
from ksadk.plugins.contracts import CompositionProfile, PluginManifest
|
|
25
|
+
from ksadk.plugins.host import PluginExecutionContext, PluginHostError
|
|
26
|
+
from ksadk.plugins.providers.mcp_projection import project_mcp_capabilities
|
|
27
|
+
from ksadk.runtime import RuntimeExecutor, RuntimeLaunchContext, RuntimeRegistry, StartRequest
|
|
28
|
+
from ksadk.runtime.conversation_execution import invoke_runtime_conversation_once
|
|
29
|
+
from ksadk.sessions import create_session_service
|
|
30
|
+
from ksadk.sessions.base import BaseSessionService
|
|
31
|
+
|
|
32
|
+
_HISTORY_ENVELOPE_PREFIX = "agentkit.conversation-history/v1:"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass(frozen=True)
|
|
36
|
+
class HarnessSkillContribution:
|
|
37
|
+
name: str
|
|
38
|
+
instructions: str
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass(frozen=True)
|
|
42
|
+
class HarnessProviderInventory:
|
|
43
|
+
provider: str
|
|
44
|
+
execution_strategy: str
|
|
45
|
+
model: str
|
|
46
|
+
history_owner: str
|
|
47
|
+
mcp_servers: tuple[str, ...]
|
|
48
|
+
skills: tuple[str, ...]
|
|
49
|
+
context_contributors: tuple[str, ...]
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass(frozen=True)
|
|
53
|
+
class HarnessTurnRequest:
|
|
54
|
+
user_id: str
|
|
55
|
+
session_id: str | None
|
|
56
|
+
messages: tuple[Mapping[str, Any], ...]
|
|
57
|
+
model: str | None = None
|
|
58
|
+
request_metadata: Mapping[str, Any] | None = None
|
|
59
|
+
invocation_id: str | None = None
|
|
60
|
+
|
|
61
|
+
@classmethod
|
|
62
|
+
def parse(cls, value: Any) -> "HarnessTurnRequest":
|
|
63
|
+
if isinstance(value, cls):
|
|
64
|
+
return value
|
|
65
|
+
if not isinstance(value, Mapping):
|
|
66
|
+
raise PluginHostError("harness_input_invalid", "Harness input must be an object")
|
|
67
|
+
user_id = str(value.get("user_id") or value.get("userId") or "").strip()
|
|
68
|
+
if not user_id:
|
|
69
|
+
raise PluginHostError("harness_input_invalid", "Harness input requires user_id")
|
|
70
|
+
raw_messages = value.get("messages")
|
|
71
|
+
if raw_messages is None and value.get("input") is not None:
|
|
72
|
+
raw_messages = [{"role": "user", "content": value.get("input")}]
|
|
73
|
+
if not isinstance(raw_messages, Sequence) or isinstance(raw_messages, (str, bytes)):
|
|
74
|
+
raise PluginHostError("harness_input_invalid", "Harness input requires messages")
|
|
75
|
+
messages: list[Mapping[str, Any]] = []
|
|
76
|
+
for index, message in enumerate(raw_messages):
|
|
77
|
+
if not isinstance(message, Mapping):
|
|
78
|
+
raise PluginHostError(
|
|
79
|
+
"harness_input_invalid",
|
|
80
|
+
f"Harness messages[{index}] must be an object",
|
|
81
|
+
)
|
|
82
|
+
role = str(message.get("role") or "").strip()
|
|
83
|
+
if role not in {"system", "user", "assistant", "tool"}:
|
|
84
|
+
raise PluginHostError(
|
|
85
|
+
"harness_input_invalid",
|
|
86
|
+
f"Harness messages[{index}] has unsupported role {role!r}",
|
|
87
|
+
)
|
|
88
|
+
messages.append(dict(message))
|
|
89
|
+
if not messages or messages[-1].get("role") != "user":
|
|
90
|
+
raise PluginHostError(
|
|
91
|
+
"harness_input_invalid", "Harness turn must end with a user message"
|
|
92
|
+
)
|
|
93
|
+
session_id = str(value.get("session_id") or value.get("sessionId") or "").strip()
|
|
94
|
+
model = str(value.get("model") or "").strip()
|
|
95
|
+
metadata = value.get("request_metadata") or value.get("requestMetadata")
|
|
96
|
+
if metadata is not None and not isinstance(metadata, Mapping):
|
|
97
|
+
raise PluginHostError("harness_input_invalid", "request_metadata must be an object")
|
|
98
|
+
return cls(
|
|
99
|
+
user_id=user_id,
|
|
100
|
+
session_id=session_id or None,
|
|
101
|
+
messages=tuple(messages),
|
|
102
|
+
model=model or None,
|
|
103
|
+
request_metadata=dict(metadata) if metadata is not None else None,
|
|
104
|
+
invocation_id=str(value.get("invocation_id") or value.get("invocationId") or "").strip()
|
|
105
|
+
or None,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@dataclass(frozen=True)
|
|
110
|
+
class HarnessTurnResult:
|
|
111
|
+
session_id: str
|
|
112
|
+
output_text: str
|
|
113
|
+
usage: Mapping[str, Any]
|
|
114
|
+
metadata: Mapping[str, Any]
|
|
115
|
+
inventory: HarnessProviderInventory
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@runtime_checkable
|
|
119
|
+
class HarnessMCPSource(Protocol):
|
|
120
|
+
def harness_mcp_specs(
|
|
121
|
+
self, bundle: ResolvedPluginBundle
|
|
122
|
+
) -> Sequence[McpToolSpec] | Awaitable[Sequence[McpToolSpec]]: ...
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
@runtime_checkable
|
|
126
|
+
class HarnessMCPActivationSource(Protocol):
|
|
127
|
+
async def release_harness_mcp_specs(self, specs: Sequence[McpToolSpec]) -> None: ...
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@runtime_checkable
|
|
131
|
+
class HarnessSkillSource(Protocol):
|
|
132
|
+
def harness_skill(self, bundle: ResolvedPluginBundle) -> HarnessSkillContribution: ...
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@runtime_checkable
|
|
136
|
+
class HarnessContextSource(Protocol):
|
|
137
|
+
async def harness_context(
|
|
138
|
+
self, bundle: ResolvedPluginBundle, request: HarnessTurnRequest
|
|
139
|
+
) -> str: ...
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class _ConversationHistoryReasoner:
|
|
143
|
+
"""Restore canonical message roles before calling the Harness reasoner.
|
|
144
|
+
|
|
145
|
+
HarnessRuntimeAdapter currently builds ``system + current user`` itself.
|
|
146
|
+
The provider encodes the canonical conversation input into that user slot;
|
|
147
|
+
this wrapper expands it back into structured roles without reimplementing
|
|
148
|
+
the Harness reasoning/tool loop.
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
def __init__(self, delegate: HarnessReasoner) -> None:
|
|
152
|
+
self._delegate = delegate
|
|
153
|
+
|
|
154
|
+
async def complete(
|
|
155
|
+
self,
|
|
156
|
+
*,
|
|
157
|
+
model: str,
|
|
158
|
+
prompt: str,
|
|
159
|
+
messages: Sequence[dict[str, Any]],
|
|
160
|
+
tools: Sequence[Any],
|
|
161
|
+
) -> Any:
|
|
162
|
+
expanded = list(messages)
|
|
163
|
+
if len(expanded) >= 2:
|
|
164
|
+
content = expanded[1].get("content")
|
|
165
|
+
if isinstance(content, str) and content.startswith(_HISTORY_ENVELOPE_PREFIX):
|
|
166
|
+
raw = content.removeprefix(_HISTORY_ENVELOPE_PREFIX)
|
|
167
|
+
try:
|
|
168
|
+
history = json.loads(raw)
|
|
169
|
+
except json.JSONDecodeError as error:
|
|
170
|
+
raise RuntimeError("invalid canonical Harness history envelope") from error
|
|
171
|
+
if not isinstance(history, list) or not all(
|
|
172
|
+
isinstance(item, dict) for item in history
|
|
173
|
+
):
|
|
174
|
+
raise RuntimeError("invalid canonical Harness history payload")
|
|
175
|
+
expanded = [expanded[0], *_chat_history(history), *expanded[2:]]
|
|
176
|
+
return await self._delegate.complete(
|
|
177
|
+
model=model,
|
|
178
|
+
prompt=prompt,
|
|
179
|
+
messages=expanded,
|
|
180
|
+
tools=tools,
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class _ConversationHistoryHarnessAdapter(HarnessRuntimeAdapter):
|
|
185
|
+
"""Compatibility adapter with SessionService as the only history owner."""
|
|
186
|
+
|
|
187
|
+
async def start(self, request: StartRequest): # type: ignore[no-untyped-def]
|
|
188
|
+
preprocessing = request.conversation_preprocessing()
|
|
189
|
+
if preprocessing is not None and preprocessing.messages:
|
|
190
|
+
request = request.model_copy(
|
|
191
|
+
update={
|
|
192
|
+
"input": _HISTORY_ENVELOPE_PREFIX
|
|
193
|
+
+ json.dumps(
|
|
194
|
+
preprocessing.messages,
|
|
195
|
+
ensure_ascii=False,
|
|
196
|
+
sort_keys=True,
|
|
197
|
+
separators=(",", ":"),
|
|
198
|
+
)
|
|
199
|
+
}
|
|
200
|
+
)
|
|
201
|
+
return await super().start(request)
|
|
202
|
+
|
|
203
|
+
async def execute_request(self, request: StartRequest) -> dict[str, Any]:
|
|
204
|
+
# The standalone Harness adapter intentionally offers process-local
|
|
205
|
+
# continuity. PluginHost already prepares the complete canonical
|
|
206
|
+
# SessionService history, so retaining that same turn again inside the
|
|
207
|
+
# adapter would create two history owners and duplicate future turns.
|
|
208
|
+
session = self._session_for(request)
|
|
209
|
+
async with session.lock:
|
|
210
|
+
session.messages.clear()
|
|
211
|
+
try:
|
|
212
|
+
result = await self._execute_session_request(request, session)
|
|
213
|
+
return cast(dict[str, Any], result)
|
|
214
|
+
finally:
|
|
215
|
+
session.messages.clear()
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
class KsADKHarnessProviderRuntime:
|
|
219
|
+
"""PluginHost AgentProvider that owns Harness activation assembly."""
|
|
220
|
+
|
|
221
|
+
def __init__(
|
|
222
|
+
self,
|
|
223
|
+
*,
|
|
224
|
+
plugin_id: str,
|
|
225
|
+
session_service: BaseSessionService,
|
|
226
|
+
reasoner: HarnessReasoner,
|
|
227
|
+
) -> None:
|
|
228
|
+
self._plugin_id = plugin_id
|
|
229
|
+
self._session_service = session_service
|
|
230
|
+
self._reasoner = reasoner
|
|
231
|
+
self._ready = False
|
|
232
|
+
self._disposed = False
|
|
233
|
+
self._last_inventory: HarnessProviderInventory | None = None
|
|
234
|
+
|
|
235
|
+
@property
|
|
236
|
+
def last_inventory(self) -> HarnessProviderInventory | None:
|
|
237
|
+
return self._last_inventory
|
|
238
|
+
|
|
239
|
+
@property
|
|
240
|
+
def disposed(self) -> bool:
|
|
241
|
+
return self._disposed
|
|
242
|
+
|
|
243
|
+
async def start(self) -> None:
|
|
244
|
+
if self._disposed:
|
|
245
|
+
raise RuntimeError("Harness provider is disposed")
|
|
246
|
+
self._ready = True
|
|
247
|
+
|
|
248
|
+
async def health(self) -> bool:
|
|
249
|
+
return self._ready and not self._disposed
|
|
250
|
+
|
|
251
|
+
async def drain(self) -> None:
|
|
252
|
+
self._ready = False
|
|
253
|
+
|
|
254
|
+
async def dispose(self) -> None:
|
|
255
|
+
self._ready = False
|
|
256
|
+
self._disposed = True
|
|
257
|
+
|
|
258
|
+
async def prepare(
|
|
259
|
+
self,
|
|
260
|
+
bundle: ResolvedPluginBundle,
|
|
261
|
+
*,
|
|
262
|
+
capabilities: PluginExecutionContext,
|
|
263
|
+
) -> "KsADKHarnessActivation":
|
|
264
|
+
if not self._ready or self._disposed:
|
|
265
|
+
raise PluginHostError("harness_provider_unavailable", "Harness provider is not ready")
|
|
266
|
+
|
|
267
|
+
async with AsyncExitStack() as mcp_cleanup:
|
|
268
|
+
projection = await project_mcp_capabilities(capabilities, bundle)
|
|
269
|
+
mcp_cleanup.push_async_callback(projection.aclose)
|
|
270
|
+
mcp_specs = list(projection.specs)
|
|
271
|
+
mcp_owners = list(projection.owners)
|
|
272
|
+
|
|
273
|
+
skills: list[HarnessSkillContribution] = []
|
|
274
|
+
skill_owners: list[str] = []
|
|
275
|
+
for binding in capabilities.all("skill.source/v1"):
|
|
276
|
+
if not isinstance(binding.runtime, HarnessSkillSource):
|
|
277
|
+
raise PluginHostError(
|
|
278
|
+
"harness_skill_incompatible",
|
|
279
|
+
f"plugin {binding.plugin_id} cannot project Harness instructions",
|
|
280
|
+
)
|
|
281
|
+
contribution = binding.runtime.harness_skill(bundle)
|
|
282
|
+
if not contribution.name.strip() or not contribution.instructions.strip():
|
|
283
|
+
raise PluginHostError(
|
|
284
|
+
"harness_skill_invalid",
|
|
285
|
+
f"plugin {binding.plugin_id} returned an empty Skill contribution",
|
|
286
|
+
)
|
|
287
|
+
skills.append(contribution)
|
|
288
|
+
skill_owners.append(binding.plugin_id)
|
|
289
|
+
|
|
290
|
+
context_sources: list[HarnessContextSource] = []
|
|
291
|
+
context_owners: list[str] = []
|
|
292
|
+
for binding in capabilities.all("context.contributor/v1"):
|
|
293
|
+
if not isinstance(binding.runtime, HarnessContextSource):
|
|
294
|
+
raise PluginHostError(
|
|
295
|
+
"harness_context_incompatible",
|
|
296
|
+
f"plugin {binding.plugin_id} cannot contribute Harness context",
|
|
297
|
+
)
|
|
298
|
+
context_sources.append(binding.runtime)
|
|
299
|
+
context_owners.append(binding.plugin_id)
|
|
300
|
+
|
|
301
|
+
execution = bundle.resolved_agent_spec.get("execution")
|
|
302
|
+
strategy = (
|
|
303
|
+
str(execution.get("strategy") or "direct").strip()
|
|
304
|
+
if isinstance(execution, Mapping)
|
|
305
|
+
else "direct"
|
|
306
|
+
)
|
|
307
|
+
if strategy != "direct":
|
|
308
|
+
raise PluginHostError(
|
|
309
|
+
"harness_execution_strategy_unsupported",
|
|
310
|
+
f"KsADK Harness Provider does not support {strategy!r}",
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
model, prompt = _bundle_model_and_prompt(bundle)
|
|
314
|
+
if skills:
|
|
315
|
+
prompt = _append_prompt_sections(
|
|
316
|
+
prompt,
|
|
317
|
+
[f"Skill {item.name}:\n{item.instructions}" for item in skills],
|
|
318
|
+
)
|
|
319
|
+
config = HarnessConfig(
|
|
320
|
+
model=model,
|
|
321
|
+
prompt=prompt,
|
|
322
|
+
mcp_tools=tuple(mcp_specs),
|
|
323
|
+
sandbox=SandboxPolicy(read_only=True),
|
|
324
|
+
runtime="yaml",
|
|
325
|
+
)
|
|
326
|
+
inventory = HarnessProviderInventory(
|
|
327
|
+
provider=self._plugin_id,
|
|
328
|
+
execution_strategy=strategy,
|
|
329
|
+
model=model,
|
|
330
|
+
history_owner="canonical_session_service",
|
|
331
|
+
mcp_servers=tuple(mcp_owners),
|
|
332
|
+
skills=tuple(item.name for item in skills),
|
|
333
|
+
context_contributors=tuple(context_owners),
|
|
334
|
+
)
|
|
335
|
+
self._last_inventory = inventory
|
|
336
|
+
workspace_root = bundle.root / "runtime"
|
|
337
|
+
if not workspace_root.is_dir():
|
|
338
|
+
workspace_root = bundle.root
|
|
339
|
+
return KsADKHarnessActivation(
|
|
340
|
+
bundle=bundle,
|
|
341
|
+
config=config,
|
|
342
|
+
agent_name=bundle.manifest.agent_id,
|
|
343
|
+
workspace_root=workspace_root,
|
|
344
|
+
reasoner=self._reasoner,
|
|
345
|
+
context_sources=tuple(context_sources),
|
|
346
|
+
session_service=self._session_service,
|
|
347
|
+
inventory=inventory,
|
|
348
|
+
mcp_cleanup=mcp_cleanup.pop_all(),
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
class KsADKHarnessProviderFactory:
|
|
353
|
+
def __init__(
|
|
354
|
+
self,
|
|
355
|
+
*,
|
|
356
|
+
session_service: BaseSessionService | None = None,
|
|
357
|
+
reasoner: HarnessReasoner | None = None,
|
|
358
|
+
) -> None:
|
|
359
|
+
self._session_service = session_service
|
|
360
|
+
self._reasoner = reasoner
|
|
361
|
+
self.runtime: KsADKHarnessProviderRuntime | None = None
|
|
362
|
+
|
|
363
|
+
async def stage(
|
|
364
|
+
self,
|
|
365
|
+
manifest: PluginManifest,
|
|
366
|
+
*,
|
|
367
|
+
profile: CompositionProfile,
|
|
368
|
+
services: Mapping[str, Any],
|
|
369
|
+
) -> KsADKHarnessProviderRuntime:
|
|
370
|
+
del profile
|
|
371
|
+
service = self._session_service or services.get("session_service")
|
|
372
|
+
if service is None:
|
|
373
|
+
service = create_session_service(backend="memory")
|
|
374
|
+
if not isinstance(service, BaseSessionService):
|
|
375
|
+
raise PluginHostError(
|
|
376
|
+
"harness_session_service_invalid",
|
|
377
|
+
"Harness provider requires a BaseSessionService",
|
|
378
|
+
)
|
|
379
|
+
reasoner = self._reasoner or services.get("harness_reasoner")
|
|
380
|
+
if reasoner is None:
|
|
381
|
+
reasoner = LiteLLMHarnessReasoner()
|
|
382
|
+
self.runtime = KsADKHarnessProviderRuntime(
|
|
383
|
+
plugin_id=manifest.metadata.id,
|
|
384
|
+
session_service=service,
|
|
385
|
+
reasoner=reasoner,
|
|
386
|
+
)
|
|
387
|
+
return self.runtime
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
class KsADKHarnessActivation:
|
|
391
|
+
def __init__(
|
|
392
|
+
self,
|
|
393
|
+
*,
|
|
394
|
+
bundle: ResolvedPluginBundle,
|
|
395
|
+
config: HarnessConfig,
|
|
396
|
+
agent_name: str,
|
|
397
|
+
workspace_root: Path,
|
|
398
|
+
reasoner: HarnessReasoner,
|
|
399
|
+
context_sources: tuple[HarnessContextSource, ...],
|
|
400
|
+
session_service: BaseSessionService,
|
|
401
|
+
inventory: HarnessProviderInventory,
|
|
402
|
+
mcp_cleanup: AsyncExitStack | None = None,
|
|
403
|
+
) -> None:
|
|
404
|
+
self._bundle = bundle
|
|
405
|
+
self._config = config
|
|
406
|
+
self._agent_name = agent_name
|
|
407
|
+
self._workspace_root = workspace_root
|
|
408
|
+
self._reasoner = reasoner
|
|
409
|
+
self._context_sources = context_sources
|
|
410
|
+
self._session_service = session_service
|
|
411
|
+
self._inventory = inventory
|
|
412
|
+
self._mcp_cleanup = mcp_cleanup
|
|
413
|
+
self._mcp_cleanup_lock = asyncio.Lock()
|
|
414
|
+
self._ready = False
|
|
415
|
+
self._disposed = False
|
|
416
|
+
self._executors: list[RuntimeExecutor] = []
|
|
417
|
+
self._kernel_adapter: HarnessRuntimeAdapter | None = None
|
|
418
|
+
|
|
419
|
+
async def start(self) -> None:
|
|
420
|
+
if self._disposed:
|
|
421
|
+
raise RuntimeError("Harness activation is disposed")
|
|
422
|
+
self._ready = True
|
|
423
|
+
|
|
424
|
+
async def health(self) -> bool:
|
|
425
|
+
return self._ready and not self._disposed
|
|
426
|
+
|
|
427
|
+
async def execute(self, request: Any) -> HarnessTurnResult:
|
|
428
|
+
if not self._ready or self._disposed:
|
|
429
|
+
raise PluginHostError(
|
|
430
|
+
"harness_activation_unavailable", "Harness activation is not ready"
|
|
431
|
+
)
|
|
432
|
+
turn = HarnessTurnRequest.parse(request)
|
|
433
|
+
context_sections = [
|
|
434
|
+
text.strip()
|
|
435
|
+
for source in self._context_sources
|
|
436
|
+
if (text := await source.harness_context(self._bundle, turn)).strip()
|
|
437
|
+
]
|
|
438
|
+
config = replace(
|
|
439
|
+
self._config,
|
|
440
|
+
prompt=_append_prompt_sections(self._config.prompt, context_sections),
|
|
441
|
+
)
|
|
442
|
+
executor, launch_context = _build_direct_backend(
|
|
443
|
+
config,
|
|
444
|
+
agent_name=self._agent_name,
|
|
445
|
+
workspace_root=self._workspace_root,
|
|
446
|
+
reasoner=self._reasoner,
|
|
447
|
+
)
|
|
448
|
+
self._executors.append(executor)
|
|
449
|
+
preparation = await executor.prepare_start(launch_context)
|
|
450
|
+
session_id, result = await invoke_runtime_conversation_once(
|
|
451
|
+
executor=executor,
|
|
452
|
+
launch_context=launch_context,
|
|
453
|
+
agent_id=self._agent_name,
|
|
454
|
+
user_id=turn.user_id,
|
|
455
|
+
messages=[dict(item) for item in turn.messages],
|
|
456
|
+
session_id=turn.session_id,
|
|
457
|
+
model=turn.model or config.model,
|
|
458
|
+
instructions=config.prompt,
|
|
459
|
+
request_metadata=turn.request_metadata,
|
|
460
|
+
invocation_id=turn.invocation_id,
|
|
461
|
+
session_service_provider=lambda: self._session_service,
|
|
462
|
+
runtime_preparation=preparation,
|
|
463
|
+
)
|
|
464
|
+
return HarnessTurnResult(
|
|
465
|
+
session_id=session_id,
|
|
466
|
+
output_text=str(result.get("output_text") or ""),
|
|
467
|
+
usage=dict(result.get("usage") or {}),
|
|
468
|
+
metadata=dict(result.get("metadata") or {}),
|
|
469
|
+
inventory=self._inventory,
|
|
470
|
+
)
|
|
471
|
+
|
|
472
|
+
def runtime_adapter(self) -> HarnessRuntimeAdapter:
|
|
473
|
+
"""Return the activation-owned adapter used by AgentKernel Scheduler.
|
|
474
|
+
|
|
475
|
+
The immutable profile has already assembled model instructions, MCP,
|
|
476
|
+
Skills, sandbox and permissions into ``self._config``. Reusing one
|
|
477
|
+
adapter per session activation preserves Harness' honest process-local
|
|
478
|
+
continuity while AgentKernel remains the only event persistence owner.
|
|
479
|
+
"""
|
|
480
|
+
|
|
481
|
+
if not self._ready or self._disposed:
|
|
482
|
+
raise PluginHostError(
|
|
483
|
+
"harness_activation_unavailable", "Harness activation is not ready"
|
|
484
|
+
)
|
|
485
|
+
if self._kernel_adapter is None:
|
|
486
|
+
self._kernel_adapter = HarnessRuntimeAdapter(
|
|
487
|
+
self._config,
|
|
488
|
+
agent_name=self._agent_name,
|
|
489
|
+
reasoner=self._reasoner,
|
|
490
|
+
workspace_root=self._workspace_root,
|
|
491
|
+
)
|
|
492
|
+
return self._kernel_adapter
|
|
493
|
+
|
|
494
|
+
async def drain(self) -> None:
|
|
495
|
+
self._ready = False
|
|
496
|
+
|
|
497
|
+
async def abort(self) -> None:
|
|
498
|
+
"""Revoke external MCP credentials before waiting on a stuck turn."""
|
|
499
|
+
|
|
500
|
+
await self._release_mcp_credentials()
|
|
501
|
+
|
|
502
|
+
async def dispose(self) -> None:
|
|
503
|
+
self._ready = False
|
|
504
|
+
first_error: BaseException | None = None
|
|
505
|
+
try:
|
|
506
|
+
await self._release_mcp_credentials()
|
|
507
|
+
except BaseException as error: # cleanup must continue
|
|
508
|
+
first_error = error
|
|
509
|
+
if self._kernel_adapter is not None:
|
|
510
|
+
try:
|
|
511
|
+
await self._kernel_adapter.close_all()
|
|
512
|
+
except BaseException as error: # cleanup must continue
|
|
513
|
+
first_error = error
|
|
514
|
+
self._kernel_adapter = None
|
|
515
|
+
for executor in reversed(self._executors):
|
|
516
|
+
try:
|
|
517
|
+
await executor.close_all()
|
|
518
|
+
except BaseException as error: # cleanup must continue
|
|
519
|
+
if first_error is None:
|
|
520
|
+
first_error = error
|
|
521
|
+
self._executors.clear()
|
|
522
|
+
self._disposed = True
|
|
523
|
+
if first_error is not None:
|
|
524
|
+
raise first_error
|
|
525
|
+
|
|
526
|
+
async def _release_mcp_credentials(self) -> None:
|
|
527
|
+
async with self._mcp_cleanup_lock:
|
|
528
|
+
cleanup = self._mcp_cleanup
|
|
529
|
+
if cleanup is not None:
|
|
530
|
+
await cleanup.aclose()
|
|
531
|
+
self._mcp_cleanup = None
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
def _build_direct_backend(
|
|
535
|
+
config: HarnessConfig,
|
|
536
|
+
*,
|
|
537
|
+
agent_name: str,
|
|
538
|
+
workspace_root: Path,
|
|
539
|
+
reasoner: HarnessReasoner,
|
|
540
|
+
) -> tuple[RuntimeExecutor, RuntimeLaunchContext]:
|
|
541
|
+
"""Internal execution seam; Phase 2 does not expose strategy as a plugin."""
|
|
542
|
+
|
|
543
|
+
history_reasoner = _ConversationHistoryReasoner(reasoner)
|
|
544
|
+
registry = RuntimeRegistry()
|
|
545
|
+
registry.register(
|
|
546
|
+
"harness",
|
|
547
|
+
lambda _context: _ConversationHistoryHarnessAdapter(
|
|
548
|
+
config,
|
|
549
|
+
agent_name=agent_name,
|
|
550
|
+
reasoner=history_reasoner,
|
|
551
|
+
workspace_root=workspace_root,
|
|
552
|
+
),
|
|
553
|
+
)
|
|
554
|
+
return RuntimeExecutor(registry), RuntimeLaunchContext(
|
|
555
|
+
runtime_type="harness",
|
|
556
|
+
project_dir=workspace_root,
|
|
557
|
+
config={
|
|
558
|
+
"model": config.model,
|
|
559
|
+
"base_instructions": config.prompt,
|
|
560
|
+
"sandbox_read_only": config.sandbox.read_only,
|
|
561
|
+
},
|
|
562
|
+
)
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
def _bundle_model_and_prompt(bundle: ResolvedPluginBundle) -> tuple[str, str]:
|
|
566
|
+
spec = bundle.resolved_agent_spec
|
|
567
|
+
raw_model = spec.get("model")
|
|
568
|
+
model = (
|
|
569
|
+
str(raw_model.get("model") or "").strip()
|
|
570
|
+
if isinstance(raw_model, Mapping)
|
|
571
|
+
else str(raw_model or "").strip()
|
|
572
|
+
)
|
|
573
|
+
instructions = spec.get("instructions")
|
|
574
|
+
if not isinstance(instructions, Mapping):
|
|
575
|
+
instructions = {}
|
|
576
|
+
system = str(instructions.get("system") or "").strip()
|
|
577
|
+
task = str(instructions.get("task") or "").strip()
|
|
578
|
+
prompt = _append_prompt_sections(system, [task])
|
|
579
|
+
if not model:
|
|
580
|
+
raise PluginHostError(
|
|
581
|
+
"harness_bundle_model_missing", "Bundle resolved Agent spec has no model"
|
|
582
|
+
)
|
|
583
|
+
if not prompt:
|
|
584
|
+
raise PluginHostError(
|
|
585
|
+
"harness_bundle_prompt_missing", "Bundle resolved Agent spec has no instructions"
|
|
586
|
+
)
|
|
587
|
+
return model, prompt
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
def _append_prompt_sections(base: str, sections: Sequence[str]) -> str:
|
|
591
|
+
values = [base.strip(), *(section.strip() for section in sections)]
|
|
592
|
+
return "\n\n".join(value for value in values if value)
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
def _chat_history(history: Sequence[Mapping[str, Any]]) -> list[dict[str, Any]]:
|
|
596
|
+
"""Translate Responses message content into the Harness chat shape."""
|
|
597
|
+
|
|
598
|
+
normalized: list[dict[str, Any]] = []
|
|
599
|
+
for item in history:
|
|
600
|
+
role = str(item.get("role") or "").strip().lower()
|
|
601
|
+
if role == "model":
|
|
602
|
+
role = "assistant"
|
|
603
|
+
if role not in {"user", "assistant", "tool"}:
|
|
604
|
+
continue
|
|
605
|
+
content = item.get("content")
|
|
606
|
+
if isinstance(content, Sequence) and not isinstance(content, (str, bytes, bytearray)):
|
|
607
|
+
segments = [
|
|
608
|
+
str(part.get("text") or "")
|
|
609
|
+
for part in content
|
|
610
|
+
if isinstance(part, Mapping) and part.get("text") is not None
|
|
611
|
+
]
|
|
612
|
+
content = "\n".join(segment for segment in segments if segment)
|
|
613
|
+
message = {"role": role, "content": str(content or "")}
|
|
614
|
+
for key in ("tool_call_id", "name", "tool_calls"):
|
|
615
|
+
if key in item:
|
|
616
|
+
message[key] = item[key]
|
|
617
|
+
normalized.append(message)
|
|
618
|
+
return normalized
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
__all__ = [
|
|
622
|
+
"HarnessContextSource",
|
|
623
|
+
"HarnessMCPSource",
|
|
624
|
+
"HarnessMCPActivationSource",
|
|
625
|
+
"HarnessProviderInventory",
|
|
626
|
+
"HarnessSkillContribution",
|
|
627
|
+
"HarnessSkillSource",
|
|
628
|
+
"HarnessTurnRequest",
|
|
629
|
+
"HarnessTurnResult",
|
|
630
|
+
"KsADKHarnessProviderFactory",
|
|
631
|
+
"KsADKHarnessProviderRuntime",
|
|
632
|
+
]
|