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,657 @@
|
|
|
1
|
+
"""Official platform-resource MCP capability for immutable Agent Bundles.
|
|
2
|
+
|
|
3
|
+
The plugin re-authorizes every activation, sends verified credentials only to
|
|
4
|
+
the private resource worker pipe, and projects the resulting scoped Core lease
|
|
5
|
+
through the provider-neutral MCP capability ABI.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
import hashlib
|
|
12
|
+
import secrets
|
|
13
|
+
import tempfile
|
|
14
|
+
from collections.abc import Callable, Coroutine, Mapping, Sequence
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
from datetime import datetime, timezone
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Any, cast
|
|
19
|
+
|
|
20
|
+
from ksadk.harness.config import McpToolSpec
|
|
21
|
+
from ksadk.plugins.bundle import ResolvedPluginBundle
|
|
22
|
+
from ksadk.plugins.contracts import CompositionProfile, PluginManifest
|
|
23
|
+
from ksadk.plugins.host import PluginHostError
|
|
24
|
+
from ksadk.resource_runtime.broker import ResourceWriteAuthorizer
|
|
25
|
+
from ksadk.resource_runtime.build_artifacts import (
|
|
26
|
+
ResourceBuildReference,
|
|
27
|
+
restore_resource_build,
|
|
28
|
+
)
|
|
29
|
+
from ksadk.resource_runtime.contracts import InvocationIdentity
|
|
30
|
+
from ksadk.resource_runtime.leases import ResourceScope
|
|
31
|
+
from ksadk.resource_runtime.supervisor import ActiveResources
|
|
32
|
+
from ksadk.resource_runtime.worker import (
|
|
33
|
+
DiscoverySkillWorkerBinding,
|
|
34
|
+
KnowledgeWorkerBinding,
|
|
35
|
+
MemoryWorkerBinding,
|
|
36
|
+
WorkerInitialization,
|
|
37
|
+
)
|
|
38
|
+
from ksadk.studio.errors import StudioError
|
|
39
|
+
from ksadk.studio.resource_authority import (
|
|
40
|
+
AdmittedResourceAccess,
|
|
41
|
+
resource_allowed_operations,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
PLATFORM_RESOURCE_MCP_PLUGIN_ID = "io.ksadk.mcp.platform-resources"
|
|
45
|
+
PLATFORM_RESOURCE_MCP_PLUGIN_VERSION = "1.0.0"
|
|
46
|
+
PLATFORM_RESOURCE_MCP_PERMISSION = "platform-resource:read"
|
|
47
|
+
PLATFORM_RESOURCE_MCP_REF = (
|
|
48
|
+
f"plugin://{PLATFORM_RESOURCE_MCP_PLUGIN_ID}@{PLATFORM_RESOURCE_MCP_PLUGIN_VERSION}"
|
|
49
|
+
)
|
|
50
|
+
_ARTIFACT_PATH = "platform-resources"
|
|
51
|
+
_CONNECTOR_NAME = "platform-resources"
|
|
52
|
+
|
|
53
|
+
ResourceWriteAuthorizerFactory = Callable[
|
|
54
|
+
[str, ResolvedPluginBundle], ResourceWriteAuthorizer | None
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _manifest_digest() -> str:
|
|
59
|
+
payload = (
|
|
60
|
+
f"{PLATFORM_RESOURCE_MCP_REF}:activation-mcp/v1:resource-worker/v1"
|
|
61
|
+
).encode()
|
|
62
|
+
return "sha256:" + hashlib.sha256(payload).hexdigest()
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def platform_resource_mcp_manifest() -> PluginManifest:
|
|
66
|
+
return cast(
|
|
67
|
+
PluginManifest,
|
|
68
|
+
PluginManifest.model_validate(
|
|
69
|
+
{
|
|
70
|
+
"metadata": {
|
|
71
|
+
"id": PLATFORM_RESOURCE_MCP_PLUGIN_ID,
|
|
72
|
+
"version": PLATFORM_RESOURCE_MCP_PLUGIN_VERSION,
|
|
73
|
+
},
|
|
74
|
+
"spec": {
|
|
75
|
+
"domain": "ksadk-platform",
|
|
76
|
+
"runtime": "python",
|
|
77
|
+
"entrypoint": (
|
|
78
|
+
"ksadk.plugins.providers.platform_resources:"
|
|
79
|
+
"PlatformResourceMCPFactory"
|
|
80
|
+
),
|
|
81
|
+
"provides": [
|
|
82
|
+
{
|
|
83
|
+
"definition": "mcp.connector/v1",
|
|
84
|
+
"slot": "mcp.platform-resources",
|
|
85
|
+
"mode": "multiple",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"definition": "memory.provider/v1",
|
|
89
|
+
"slot": "memory.primary",
|
|
90
|
+
"mode": "unique",
|
|
91
|
+
}
|
|
92
|
+
],
|
|
93
|
+
"permissions": [
|
|
94
|
+
"network:mcp",
|
|
95
|
+
PLATFORM_RESOURCE_MCP_PERMISSION,
|
|
96
|
+
"process:resource-worker",
|
|
97
|
+
],
|
|
98
|
+
"isolation": "process",
|
|
99
|
+
"compatibility": {
|
|
100
|
+
"kernelApi": ">=1,<2",
|
|
101
|
+
"runtimeProtocols": ["agentkit.runtime/v1", "2025-06-18"],
|
|
102
|
+
"python": ">=3.10,<3.15",
|
|
103
|
+
},
|
|
104
|
+
"healthContract": "plugin.health/v1",
|
|
105
|
+
"provenance": {
|
|
106
|
+
"source": "builtin",
|
|
107
|
+
"digest": _manifest_digest(),
|
|
108
|
+
"license": "Apache-2.0",
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
}
|
|
112
|
+
),
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def platform_resource_capability_selected(profile: CompositionProfile) -> bool:
|
|
117
|
+
return any(item.ref == PLATFORM_RESOURCE_MCP_REF for item in profile.capabilities)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _activation_operations(
|
|
121
|
+
bundle: ResolvedPluginBundle,
|
|
122
|
+
*,
|
|
123
|
+
binding_id: str,
|
|
124
|
+
allowed: tuple[str, ...],
|
|
125
|
+
write_authorizer: ResourceWriteAuthorizer | None,
|
|
126
|
+
) -> tuple[str, ...]:
|
|
127
|
+
"""Narrow an admitted maximum to the immutable Agent memory policy."""
|
|
128
|
+
|
|
129
|
+
read_operations = tuple(operation for operation in allowed if operation != "save_memory")
|
|
130
|
+
if "save_memory" not in allowed or write_authorizer is None:
|
|
131
|
+
return tuple(operation for operation in read_operations if operation != "memory_status")
|
|
132
|
+
resolved = bundle.resolved_agent_spec
|
|
133
|
+
memory = resolved.get("memory") if isinstance(resolved, Mapping) else None
|
|
134
|
+
context = resolved.get("context") if isinstance(resolved, Mapping) else None
|
|
135
|
+
write = memory.get("write") if isinstance(memory, Mapping) else None
|
|
136
|
+
rollout = context.get("rollout") if isinstance(context, Mapping) else None
|
|
137
|
+
if (
|
|
138
|
+
not isinstance(memory, Mapping)
|
|
139
|
+
or not bool(memory.get("enabled"))
|
|
140
|
+
or str(memory.get("providerRef") or "") != f"binding://{binding_id}"
|
|
141
|
+
or not isinstance(write, Mapping)
|
|
142
|
+
or str(write.get("mode") or "off") not in {"explicit_only", "candidate"}
|
|
143
|
+
or not isinstance(rollout, Mapping)
|
|
144
|
+
or str(rollout.get("memoryWrite") or "off") != "enabled"
|
|
145
|
+
):
|
|
146
|
+
return tuple(operation for operation in read_operations if operation != "memory_status")
|
|
147
|
+
return tuple(operation for operation in allowed if operation in {
|
|
148
|
+
"load_memory", "save_memory", "memory_status",
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _profile_config(profile: CompositionProfile) -> Mapping[str, Any]:
|
|
153
|
+
matches = [item for item in profile.capabilities if item.ref == PLATFORM_RESOURCE_MCP_REF]
|
|
154
|
+
if len(matches) != 1:
|
|
155
|
+
raise PluginHostError(
|
|
156
|
+
"platform_resource_binding_invalid",
|
|
157
|
+
"platform resource capability requires its fixed Bundle artifact path",
|
|
158
|
+
)
|
|
159
|
+
config = matches[0].config
|
|
160
|
+
if config.get("artifactPath") != _ARTIFACT_PATH or set(config) - {
|
|
161
|
+
"artifactPath",
|
|
162
|
+
"providerRef",
|
|
163
|
+
"scopes",
|
|
164
|
+
}:
|
|
165
|
+
raise PluginHostError(
|
|
166
|
+
"platform_resource_binding_invalid",
|
|
167
|
+
"platform resource capability requires its fixed Bundle artifact path",
|
|
168
|
+
)
|
|
169
|
+
provider_ref = config.get("providerRef")
|
|
170
|
+
if provider_ref is not None and (
|
|
171
|
+
not isinstance(provider_ref, str) or not provider_ref.startswith("binding://")
|
|
172
|
+
):
|
|
173
|
+
raise PluginHostError(
|
|
174
|
+
"platform_resource_binding_invalid",
|
|
175
|
+
"platform memory provider must reference an admitted resource binding",
|
|
176
|
+
)
|
|
177
|
+
if provider_ref is not None and config.get("scopes") != ["user"]:
|
|
178
|
+
raise PluginHostError(
|
|
179
|
+
"platform_resource_binding_invalid",
|
|
180
|
+
"platform memory provider requires the explicit user scope",
|
|
181
|
+
)
|
|
182
|
+
return config
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def _runtime_identity(
|
|
186
|
+
*,
|
|
187
|
+
access: AdmittedResourceAccess,
|
|
188
|
+
actor_ref: str,
|
|
189
|
+
agent_id: str,
|
|
190
|
+
activation_key: str,
|
|
191
|
+
) -> InvocationIdentity:
|
|
192
|
+
session_digest = hashlib.sha256(activation_key.encode()).hexdigest()[:40]
|
|
193
|
+
return InvocationIdentity(
|
|
194
|
+
tenant_ref=access.authority.tenant_ref,
|
|
195
|
+
resource_principal_ref=access.authority.resource_principal_ref,
|
|
196
|
+
actor_ref=actor_ref,
|
|
197
|
+
memory_subject_ref=actor_ref,
|
|
198
|
+
agent_id=agent_id,
|
|
199
|
+
session_ref=f"session-{session_digest}",
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def _validate_access(frozen: Any, access: AdmittedResourceAccess) -> None:
|
|
204
|
+
grant = access.authority
|
|
205
|
+
if (
|
|
206
|
+
grant.connection_ref != frozen.connection.connection_ref
|
|
207
|
+
or grant.connection_revision != frozen.connection_revision
|
|
208
|
+
or grant.tenant_ref != frozen.connection.tenant_ref
|
|
209
|
+
or grant.resource_principal_ref != frozen.connection.principal_ref
|
|
210
|
+
or grant.resource != frozen.config.binding.resource
|
|
211
|
+
or grant.data_endpoint != frozen.connection.endpoint
|
|
212
|
+
or grant.expires_at <= datetime.now(timezone.utc)
|
|
213
|
+
or tuple(grant.allowed_operations) != resource_allowed_operations(frozen.config)
|
|
214
|
+
):
|
|
215
|
+
raise PluginHostError(
|
|
216
|
+
"platform_resource_authority_mismatch",
|
|
217
|
+
"runtime resource authority does not match the immutable Build",
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
async def _finish_task(task: asyncio.Task[None]) -> None:
|
|
222
|
+
"""Finish a security cleanup before propagating caller cancellation."""
|
|
223
|
+
|
|
224
|
+
interrupted = False
|
|
225
|
+
while not task.done():
|
|
226
|
+
try:
|
|
227
|
+
await asyncio.shield(task)
|
|
228
|
+
except asyncio.CancelledError:
|
|
229
|
+
interrupted = True
|
|
230
|
+
task.result()
|
|
231
|
+
if interrupted:
|
|
232
|
+
raise asyncio.CancelledError
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
async def _finish_cleanup(cleanup: Coroutine[Any, Any, None]) -> None:
|
|
236
|
+
await _finish_task(asyncio.create_task(cleanup))
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
@dataclass(frozen=True)
|
|
240
|
+
class _OwnedActivation:
|
|
241
|
+
resources: ActiveResources
|
|
242
|
+
spec: McpToolSpec
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
class PlatformResourceMCPRuntime:
|
|
246
|
+
"""Activation-scoped resource worker and DSH Core lease owner."""
|
|
247
|
+
|
|
248
|
+
def __init__(
|
|
249
|
+
self,
|
|
250
|
+
*,
|
|
251
|
+
profile: CompositionProfile,
|
|
252
|
+
authority: Any,
|
|
253
|
+
connections: Any,
|
|
254
|
+
dsh_service: Any,
|
|
255
|
+
actor_ref: str,
|
|
256
|
+
state_root: Path,
|
|
257
|
+
write_authorizer_factory: ResourceWriteAuthorizerFactory | None = None,
|
|
258
|
+
) -> None:
|
|
259
|
+
_profile_config(profile)
|
|
260
|
+
if not callable(getattr(authority, "admit_runtime", None)):
|
|
261
|
+
raise PluginHostError(
|
|
262
|
+
"platform_resource_authority_unavailable",
|
|
263
|
+
"platform resource runtime requires credential-bound authority admission",
|
|
264
|
+
)
|
|
265
|
+
if not callable(getattr(connections, "get", None)):
|
|
266
|
+
raise PluginHostError(
|
|
267
|
+
"platform_resource_connections_unavailable",
|
|
268
|
+
"platform resource runtime requires a revisioned connection store",
|
|
269
|
+
)
|
|
270
|
+
required_dsh_methods = (
|
|
271
|
+
"prepare_resource_generation",
|
|
272
|
+
"activate_resources",
|
|
273
|
+
"resource_connector_lease",
|
|
274
|
+
"deactivate_resources",
|
|
275
|
+
)
|
|
276
|
+
missing_dsh_methods = tuple(
|
|
277
|
+
name for name in required_dsh_methods if not callable(getattr(dsh_service, name, None))
|
|
278
|
+
)
|
|
279
|
+
if missing_dsh_methods:
|
|
280
|
+
raise PluginHostError(
|
|
281
|
+
"platform_resource_dsh_unavailable",
|
|
282
|
+
"platform resource runtime requires the DSH resource lifecycle service",
|
|
283
|
+
)
|
|
284
|
+
if not actor_ref or any(character.isspace() for character in actor_ref):
|
|
285
|
+
raise PluginHostError(
|
|
286
|
+
"platform_resource_identity_invalid",
|
|
287
|
+
"platform resource runtime requires a trusted actor identity",
|
|
288
|
+
)
|
|
289
|
+
self._authority = authority
|
|
290
|
+
self._connections = connections
|
|
291
|
+
self._dsh = dsh_service
|
|
292
|
+
self._actor_ref = actor_ref
|
|
293
|
+
self._state_root = state_root.resolve()
|
|
294
|
+
self._write_authorizer_factory = write_authorizer_factory
|
|
295
|
+
self._lock = asyncio.Lock()
|
|
296
|
+
self._owned: dict[str, _OwnedActivation] = {}
|
|
297
|
+
self._pending: set[str] = set()
|
|
298
|
+
self._cleanup_tasks: dict[str, asyncio.Task[None]] = {}
|
|
299
|
+
self._ready = False
|
|
300
|
+
self._disposed = False
|
|
301
|
+
|
|
302
|
+
async def start(self) -> None:
|
|
303
|
+
if self._disposed:
|
|
304
|
+
raise PluginHostError(
|
|
305
|
+
"platform_resource_disposed",
|
|
306
|
+
"platform resource capability is disposed",
|
|
307
|
+
)
|
|
308
|
+
self._state_root.mkdir(parents=True, exist_ok=True, mode=0o700)
|
|
309
|
+
self._ready = True
|
|
310
|
+
|
|
311
|
+
async def health(self) -> bool:
|
|
312
|
+
return self._ready and not self._disposed
|
|
313
|
+
|
|
314
|
+
async def drain(self) -> None:
|
|
315
|
+
self._ready = False
|
|
316
|
+
|
|
317
|
+
async def dispose(self) -> None:
|
|
318
|
+
self._ready = False
|
|
319
|
+
first_error: BaseException | None = None
|
|
320
|
+
async with self._lock:
|
|
321
|
+
keys = tuple(self._owned)
|
|
322
|
+
for activation_key in keys:
|
|
323
|
+
try:
|
|
324
|
+
await self._release(activation_key)
|
|
325
|
+
except BaseException as error:
|
|
326
|
+
if first_error is None:
|
|
327
|
+
first_error = error
|
|
328
|
+
self._disposed = True
|
|
329
|
+
if first_error is not None:
|
|
330
|
+
raise first_error
|
|
331
|
+
|
|
332
|
+
async def activation_mcp_specs(
|
|
333
|
+
self,
|
|
334
|
+
bundle: ResolvedPluginBundle,
|
|
335
|
+
*,
|
|
336
|
+
activation_key: str,
|
|
337
|
+
) -> tuple[McpToolSpec, ...]:
|
|
338
|
+
if not self._ready or self._disposed:
|
|
339
|
+
raise PluginHostError(
|
|
340
|
+
"platform_resource_unavailable",
|
|
341
|
+
"platform resource capability is not ready",
|
|
342
|
+
)
|
|
343
|
+
if not activation_key:
|
|
344
|
+
raise PluginHostError(
|
|
345
|
+
"platform_resource_activation_key_missing",
|
|
346
|
+
"platform resources require a host-owned activation key",
|
|
347
|
+
)
|
|
348
|
+
async with self._lock:
|
|
349
|
+
if activation_key in self._owned or activation_key in self._pending:
|
|
350
|
+
raise PluginHostError(
|
|
351
|
+
"platform_resource_activation_duplicate",
|
|
352
|
+
"platform resources are already active for this activation",
|
|
353
|
+
)
|
|
354
|
+
self._pending.add(activation_key)
|
|
355
|
+
|
|
356
|
+
active: ActiveResources | None = None
|
|
357
|
+
owned = False
|
|
358
|
+
try:
|
|
359
|
+
try:
|
|
360
|
+
manifest = bundle.manifest
|
|
361
|
+
if not manifest.resource_build_digest or not manifest.resource_snapshot_digest:
|
|
362
|
+
raise PluginHostError(
|
|
363
|
+
"platform_resource_build_missing",
|
|
364
|
+
"Bundle has no immutable platform resource artifact",
|
|
365
|
+
)
|
|
366
|
+
reference = ResourceBuildReference(
|
|
367
|
+
digest=manifest.resource_build_digest,
|
|
368
|
+
snapshot_digest=manifest.resource_snapshot_digest,
|
|
369
|
+
)
|
|
370
|
+
with tempfile.TemporaryDirectory(
|
|
371
|
+
prefix="resource-restore-",
|
|
372
|
+
dir=self._state_root,
|
|
373
|
+
) as cache:
|
|
374
|
+
restored, packages = await asyncio.to_thread(
|
|
375
|
+
restore_resource_build,
|
|
376
|
+
bundle.root / _ARTIFACT_PATH,
|
|
377
|
+
reference,
|
|
378
|
+
cache_directory=Path(cache),
|
|
379
|
+
)
|
|
380
|
+
if packages:
|
|
381
|
+
raise PluginHostError(
|
|
382
|
+
"platform_resource_runtime_unsupported",
|
|
383
|
+
"pinned Skill packages are not supported by this activation adapter",
|
|
384
|
+
)
|
|
385
|
+
snapshot = restored.snapshot
|
|
386
|
+
if snapshot.dsh_profile is None:
|
|
387
|
+
raise PluginHostError(
|
|
388
|
+
"platform_resource_profile_missing",
|
|
389
|
+
"resource Build has no locked DSH Profile",
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
accesses: list[AdmittedResourceAccess] = []
|
|
393
|
+
for frozen in snapshot.bindings:
|
|
394
|
+
current = await asyncio.to_thread(
|
|
395
|
+
self._connections.get,
|
|
396
|
+
frozen.connection.connection_ref,
|
|
397
|
+
)
|
|
398
|
+
if (
|
|
399
|
+
current.target != frozen.connection
|
|
400
|
+
or current.revision != frozen.connection_revision
|
|
401
|
+
):
|
|
402
|
+
raise PluginHostError(
|
|
403
|
+
"platform_resource_connection_changed",
|
|
404
|
+
"resource connection changed after this Build",
|
|
405
|
+
)
|
|
406
|
+
access = await asyncio.to_thread(
|
|
407
|
+
self._authority.admit_runtime,
|
|
408
|
+
frozen.config,
|
|
409
|
+
expected_connection_revision=frozen.connection_revision,
|
|
410
|
+
)
|
|
411
|
+
if not isinstance(access, AdmittedResourceAccess):
|
|
412
|
+
raise PluginHostError(
|
|
413
|
+
"platform_resource_authority_invalid",
|
|
414
|
+
"resource authority returned an invalid runtime admission",
|
|
415
|
+
)
|
|
416
|
+
_validate_access(frozen, access)
|
|
417
|
+
if await asyncio.to_thread(
|
|
418
|
+
self._connections.get,
|
|
419
|
+
frozen.connection.connection_ref,
|
|
420
|
+
) != current:
|
|
421
|
+
raise PluginHostError(
|
|
422
|
+
"platform_resource_connection_changed",
|
|
423
|
+
"resource connection changed during activation",
|
|
424
|
+
)
|
|
425
|
+
accesses.append(access)
|
|
426
|
+
|
|
427
|
+
if not accesses:
|
|
428
|
+
raise PluginHostError(
|
|
429
|
+
"platform_resource_build_empty",
|
|
430
|
+
"resource Build contains no runtime bindings",
|
|
431
|
+
)
|
|
432
|
+
identity = _runtime_identity(
|
|
433
|
+
access=accesses[0],
|
|
434
|
+
actor_ref=self._actor_ref,
|
|
435
|
+
agent_id=manifest.agent_id,
|
|
436
|
+
activation_key=activation_key,
|
|
437
|
+
)
|
|
438
|
+
if any(
|
|
439
|
+
access.authority.tenant_ref != identity.tenant_ref
|
|
440
|
+
or access.authority.resource_principal_ref
|
|
441
|
+
!= identity.resource_principal_ref
|
|
442
|
+
for access in accesses
|
|
443
|
+
):
|
|
444
|
+
raise PluginHostError(
|
|
445
|
+
"platform_resource_identity_mixed",
|
|
446
|
+
"one activation cannot mix resource principals",
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
write_authorizer = (
|
|
450
|
+
self._write_authorizer_factory(activation_key, bundle)
|
|
451
|
+
if self._write_authorizer_factory is not None
|
|
452
|
+
else None
|
|
453
|
+
)
|
|
454
|
+
descriptor, generation_id = await self._dsh.prepare_resource_generation(
|
|
455
|
+
snapshot.dsh_profile
|
|
456
|
+
)
|
|
457
|
+
activation_id = "resource-" + secrets.token_hex(24)
|
|
458
|
+
scopes = tuple(
|
|
459
|
+
ResourceScope(
|
|
460
|
+
profile_digest=descriptor.profile_digest,
|
|
461
|
+
generation_id=generation_id,
|
|
462
|
+
activation_id=activation_id,
|
|
463
|
+
build_digest=manifest.bundle_digest,
|
|
464
|
+
binding_snapshot_digest=snapshot.digest,
|
|
465
|
+
identity=identity,
|
|
466
|
+
binding_id=frozen.config.binding.id,
|
|
467
|
+
allowed_operations=_activation_operations(
|
|
468
|
+
bundle,
|
|
469
|
+
binding_id=frozen.config.binding.id,
|
|
470
|
+
allowed=access.authority.allowed_operations,
|
|
471
|
+
write_authorizer=write_authorizer,
|
|
472
|
+
),
|
|
473
|
+
)
|
|
474
|
+
for frozen, access in zip(snapshot.bindings, accesses, strict=True)
|
|
475
|
+
)
|
|
476
|
+
bindings = []
|
|
477
|
+
for frozen, access in zip(snapshot.bindings, accesses, strict=True):
|
|
478
|
+
credentials = access.credentials
|
|
479
|
+
if credentials.access_key is None or credentials.secret_key is None:
|
|
480
|
+
raise PluginHostError(
|
|
481
|
+
"platform_resource_credentials_invalid",
|
|
482
|
+
"platform resource admission did not return signed credentials",
|
|
483
|
+
)
|
|
484
|
+
common = {
|
|
485
|
+
"config": frozen.config,
|
|
486
|
+
"endpoint": frozen.connection.endpoint,
|
|
487
|
+
"access_key": credentials.access_key,
|
|
488
|
+
"secret_key": credentials.secret_key,
|
|
489
|
+
"session_token": credentials.session_token or "",
|
|
490
|
+
}
|
|
491
|
+
kind = frozen.config.binding.resource.kind
|
|
492
|
+
if kind == "knowledge-base":
|
|
493
|
+
binding = KnowledgeWorkerBinding(**common)
|
|
494
|
+
elif kind == "memory-instance":
|
|
495
|
+
binding = MemoryWorkerBinding(**common)
|
|
496
|
+
elif frozen.config.selection_mode == "discovery":
|
|
497
|
+
binding = DiscoverySkillWorkerBinding(
|
|
498
|
+
**common,
|
|
499
|
+
cache_directory=(self._state_root / "skill-cache" / activation_id),
|
|
500
|
+
selection_run_ref=(
|
|
501
|
+
"selection-"
|
|
502
|
+
+ hashlib.sha256(activation_key.encode()).hexdigest()[:40]
|
|
503
|
+
),
|
|
504
|
+
)
|
|
505
|
+
else:
|
|
506
|
+
raise PluginHostError(
|
|
507
|
+
"platform_resource_runtime_unsupported",
|
|
508
|
+
"pinned Skill activation is not supported by this adapter",
|
|
509
|
+
)
|
|
510
|
+
bindings.append(binding)
|
|
511
|
+
initialization = WorkerInitialization(
|
|
512
|
+
resource_snapshot=snapshot,
|
|
513
|
+
bindings=tuple(bindings),
|
|
514
|
+
scopes=scopes,
|
|
515
|
+
)
|
|
516
|
+
if write_authorizer is None:
|
|
517
|
+
active = await self._dsh.activate_resources(
|
|
518
|
+
initialization,
|
|
519
|
+
expected=snapshot.dsh_profile,
|
|
520
|
+
)
|
|
521
|
+
else:
|
|
522
|
+
active = await self._dsh.activate_resources(
|
|
523
|
+
initialization,
|
|
524
|
+
expected=snapshot.dsh_profile,
|
|
525
|
+
write_authorizer=write_authorizer,
|
|
526
|
+
)
|
|
527
|
+
connector = await self._dsh.resource_connector_lease(active)
|
|
528
|
+
operations = tuple(
|
|
529
|
+
dict.fromkeys(
|
|
530
|
+
operation
|
|
531
|
+
for scope in scopes
|
|
532
|
+
for operation in scope.allowed_operations
|
|
533
|
+
)
|
|
534
|
+
)
|
|
535
|
+
aliases = {operation: operation for operation in operations}
|
|
536
|
+
token = connector.resource_bearer_token(aliases, active.leases)
|
|
537
|
+
spec = McpToolSpec(
|
|
538
|
+
name=_CONNECTOR_NAME,
|
|
539
|
+
url=connector.endpoint,
|
|
540
|
+
api_key=token,
|
|
541
|
+
tool_filter=operations,
|
|
542
|
+
)
|
|
543
|
+
async with self._lock:
|
|
544
|
+
if self._disposed or not self._ready:
|
|
545
|
+
raise PluginHostError(
|
|
546
|
+
"platform_resource_unavailable",
|
|
547
|
+
"platform resource capability stopped during activation",
|
|
548
|
+
)
|
|
549
|
+
self._owned[activation_key] = _OwnedActivation(active, spec)
|
|
550
|
+
self._pending.discard(activation_key)
|
|
551
|
+
owned = True
|
|
552
|
+
return (spec,)
|
|
553
|
+
except BaseException:
|
|
554
|
+
if active is not None and not owned:
|
|
555
|
+
await _finish_cleanup(
|
|
556
|
+
self._dsh.deactivate_resources(active.activation_id)
|
|
557
|
+
)
|
|
558
|
+
raise
|
|
559
|
+
finally:
|
|
560
|
+
if not owned:
|
|
561
|
+
await _finish_cleanup(self._discard_pending(activation_key))
|
|
562
|
+
except (PluginHostError, asyncio.CancelledError):
|
|
563
|
+
raise
|
|
564
|
+
except StudioError as error:
|
|
565
|
+
raise PluginHostError(error.code.lower(), str(error)) from error
|
|
566
|
+
except Exception as error:
|
|
567
|
+
raise PluginHostError(
|
|
568
|
+
"platform_resource_activation_failed",
|
|
569
|
+
"platform resource activation failed",
|
|
570
|
+
) from error
|
|
571
|
+
|
|
572
|
+
async def release_activation_mcp_specs(
|
|
573
|
+
self,
|
|
574
|
+
activation_key: str,
|
|
575
|
+
specs: Sequence[McpToolSpec],
|
|
576
|
+
) -> None:
|
|
577
|
+
async with self._lock:
|
|
578
|
+
owned = self._owned.get(activation_key)
|
|
579
|
+
if owned is None:
|
|
580
|
+
return
|
|
581
|
+
if tuple(specs) != (owned.spec,):
|
|
582
|
+
raise PluginHostError(
|
|
583
|
+
"platform_resource_release_mismatch",
|
|
584
|
+
"platform resource cleanup does not match its activation lease",
|
|
585
|
+
)
|
|
586
|
+
await self._release(activation_key)
|
|
587
|
+
|
|
588
|
+
async def _release(self, activation_key: str) -> None:
|
|
589
|
+
async with self._lock:
|
|
590
|
+
owned = self._owned.get(activation_key)
|
|
591
|
+
if owned is None:
|
|
592
|
+
return
|
|
593
|
+
task = self._cleanup_tasks.get(activation_key)
|
|
594
|
+
if task is None:
|
|
595
|
+
task = asyncio.create_task(
|
|
596
|
+
self._dsh.deactivate_resources(owned.resources.activation_id)
|
|
597
|
+
)
|
|
598
|
+
self._cleanup_tasks[activation_key] = task
|
|
599
|
+
try:
|
|
600
|
+
await _finish_task(task)
|
|
601
|
+
finally:
|
|
602
|
+
if task.done():
|
|
603
|
+
async with self._lock:
|
|
604
|
+
self._cleanup_tasks.pop(activation_key, None)
|
|
605
|
+
if not task.cancelled() and task.exception() is None:
|
|
606
|
+
self._owned.pop(activation_key, None)
|
|
607
|
+
task.result()
|
|
608
|
+
|
|
609
|
+
async def _discard_pending(self, activation_key: str) -> None:
|
|
610
|
+
async with self._lock:
|
|
611
|
+
self._pending.discard(activation_key)
|
|
612
|
+
|
|
613
|
+
|
|
614
|
+
class PlatformResourceMCPFactory:
|
|
615
|
+
def __init__(self) -> None:
|
|
616
|
+
self.runtime: PlatformResourceMCPRuntime | None = None
|
|
617
|
+
|
|
618
|
+
async def stage(
|
|
619
|
+
self,
|
|
620
|
+
manifest: PluginManifest,
|
|
621
|
+
*,
|
|
622
|
+
profile: CompositionProfile,
|
|
623
|
+
services: Mapping[str, Any],
|
|
624
|
+
) -> PlatformResourceMCPRuntime:
|
|
625
|
+
if manifest.metadata.id != PLATFORM_RESOURCE_MCP_PLUGIN_ID:
|
|
626
|
+
raise PluginHostError(
|
|
627
|
+
"platform_resource_manifest_invalid",
|
|
628
|
+
"platform resource factory received another plugin manifest",
|
|
629
|
+
)
|
|
630
|
+
state_root = services.get("runtime_state_root")
|
|
631
|
+
if state_root is None:
|
|
632
|
+
raise PluginHostError(
|
|
633
|
+
"platform_resource_state_unavailable",
|
|
634
|
+
"platform resource runtime state root is unavailable",
|
|
635
|
+
)
|
|
636
|
+
self.runtime = PlatformResourceMCPRuntime(
|
|
637
|
+
profile=profile,
|
|
638
|
+
authority=services.get("resource_authority"),
|
|
639
|
+
connections=services.get("resource_connections"),
|
|
640
|
+
dsh_service=services.get("dsh_capability_service"),
|
|
641
|
+
actor_ref=str(services.get("resource_actor_ref") or ""),
|
|
642
|
+
state_root=Path(str(state_root)) / "platform-resources",
|
|
643
|
+
write_authorizer_factory=services.get("resource_write_authorizer_factory"),
|
|
644
|
+
)
|
|
645
|
+
return self.runtime
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
__all__ = [
|
|
649
|
+
"PLATFORM_RESOURCE_MCP_PERMISSION",
|
|
650
|
+
"PLATFORM_RESOURCE_MCP_PLUGIN_ID",
|
|
651
|
+
"PLATFORM_RESOURCE_MCP_PLUGIN_VERSION",
|
|
652
|
+
"PLATFORM_RESOURCE_MCP_REF",
|
|
653
|
+
"PlatformResourceMCPFactory",
|
|
654
|
+
"PlatformResourceMCPRuntime",
|
|
655
|
+
"platform_resource_capability_selected",
|
|
656
|
+
"platform_resource_mcp_manifest",
|
|
657
|
+
]
|