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,142 @@
|
|
|
1
|
+
"""Bounded resource IPC framing shared by broker and worker pipes.
|
|
2
|
+
|
|
3
|
+
Transport owners enforce deadlines and connection permissions. No pickle,
|
|
4
|
+
reflection, imports or executable payloads are accepted by this protocol.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import math
|
|
11
|
+
import struct
|
|
12
|
+
from typing import BinaryIO, Literal
|
|
13
|
+
|
|
14
|
+
from pydantic import Field, field_validator
|
|
15
|
+
|
|
16
|
+
from ksadk.plugins.contracts import PluginContractModel
|
|
17
|
+
from ksadk.resource_runtime.contracts import Identifier
|
|
18
|
+
|
|
19
|
+
MAX_FRAME_BYTES = 1024 * 1024
|
|
20
|
+
ResourceOperation = Literal[
|
|
21
|
+
"search_knowledge_base",
|
|
22
|
+
"load_memory",
|
|
23
|
+
"save_memory",
|
|
24
|
+
"update_memory",
|
|
25
|
+
"delete_memory",
|
|
26
|
+
"memory_status",
|
|
27
|
+
"list_skill_spaces",
|
|
28
|
+
"list_skills",
|
|
29
|
+
"search_skills",
|
|
30
|
+
"load_skill",
|
|
31
|
+
"read_skill_resource",
|
|
32
|
+
"execute_skills",
|
|
33
|
+
"read_skill_artifact",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ResourceRequest(PluginContractModel):
|
|
38
|
+
v: Literal[1]
|
|
39
|
+
request_id: Identifier
|
|
40
|
+
deadline: int = Field(strict=True, gt=0, description="Absolute Unix time in milliseconds")
|
|
41
|
+
operation: ResourceOperation
|
|
42
|
+
handle: str = Field(strict=True, min_length=32, max_length=256, repr=False)
|
|
43
|
+
arguments: dict = Field(default_factory=dict)
|
|
44
|
+
check_only: bool = Field(default=False, strict=True)
|
|
45
|
+
|
|
46
|
+
@field_validator("v", mode="before")
|
|
47
|
+
@classmethod
|
|
48
|
+
def strict_version(cls, value: object) -> object:
|
|
49
|
+
if type(value) is not int:
|
|
50
|
+
raise ValueError("IPC version must be an integer")
|
|
51
|
+
return value
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class FrameError(ValueError):
|
|
55
|
+
"""Public message is fixed and never includes frame contents."""
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _unique_object(pairs: list[tuple[str, object]]) -> dict:
|
|
59
|
+
result = {}
|
|
60
|
+
for key, value in pairs:
|
|
61
|
+
if key in result:
|
|
62
|
+
raise FrameError("Duplicate IPC object field")
|
|
63
|
+
result[key] = value
|
|
64
|
+
return result
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _reject_constant(_: str) -> None:
|
|
68
|
+
raise FrameError("Non-finite IPC number")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _finite_float(value: str) -> float:
|
|
72
|
+
parsed = float(value)
|
|
73
|
+
if not math.isfinite(parsed):
|
|
74
|
+
raise FrameError("Non-finite IPC number")
|
|
75
|
+
return parsed
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def encode_frame(payload: dict) -> bytes:
|
|
79
|
+
if not isinstance(payload, dict):
|
|
80
|
+
raise FrameError("IPC frame must contain an object")
|
|
81
|
+
try:
|
|
82
|
+
body = json.dumps(
|
|
83
|
+
payload, ensure_ascii=False, separators=(",", ":"), allow_nan=False
|
|
84
|
+
).encode("utf-8")
|
|
85
|
+
except (ValueError, TypeError, RecursionError, UnicodeError):
|
|
86
|
+
raise FrameError("Invalid IPC object") from None
|
|
87
|
+
if len(body) > MAX_FRAME_BYTES:
|
|
88
|
+
raise FrameError("IPC frame exceeds size limit")
|
|
89
|
+
return struct.pack("!I", len(body)) + body
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def decode_body(body: bytes) -> dict:
|
|
93
|
+
if not 0 < len(body) <= MAX_FRAME_BYTES:
|
|
94
|
+
raise FrameError("Invalid IPC frame length")
|
|
95
|
+
try:
|
|
96
|
+
payload = json.loads(
|
|
97
|
+
body.decode("utf-8"),
|
|
98
|
+
object_pairs_hook=_unique_object,
|
|
99
|
+
parse_constant=_reject_constant,
|
|
100
|
+
parse_float=_finite_float,
|
|
101
|
+
)
|
|
102
|
+
except FrameError:
|
|
103
|
+
raise
|
|
104
|
+
except (ValueError, UnicodeError, RecursionError):
|
|
105
|
+
raise FrameError("Invalid IPC JSON") from None
|
|
106
|
+
if not isinstance(payload, dict):
|
|
107
|
+
raise FrameError("IPC frame must contain an object")
|
|
108
|
+
return payload
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _read_exact(stream: BinaryIO, size: int, *, clean_eof: bool = False) -> bytes | None:
|
|
112
|
+
chunks = bytearray()
|
|
113
|
+
while len(chunks) < size:
|
|
114
|
+
chunk = stream.read(size - len(chunks))
|
|
115
|
+
if not chunk:
|
|
116
|
+
if clean_eof and not chunks:
|
|
117
|
+
return None
|
|
118
|
+
raise FrameError("Truncated IPC frame")
|
|
119
|
+
chunks.extend(chunk)
|
|
120
|
+
return bytes(chunks)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def read_frame(stream: BinaryIO) -> dict | None:
|
|
124
|
+
prefix = _read_exact(stream, 4, clean_eof=True)
|
|
125
|
+
if prefix is None:
|
|
126
|
+
return None
|
|
127
|
+
(size,) = struct.unpack("!I", prefix)
|
|
128
|
+
if not 0 < size <= MAX_FRAME_BYTES:
|
|
129
|
+
raise FrameError("Invalid IPC frame length")
|
|
130
|
+
body = _read_exact(stream, size)
|
|
131
|
+
assert body is not None
|
|
132
|
+
return decode_body(body)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def write_frame(stream: BinaryIO, payload: dict) -> None:
|
|
136
|
+
frame = memoryview(encode_frame(payload))
|
|
137
|
+
while frame:
|
|
138
|
+
written = stream.write(frame)
|
|
139
|
+
if written is None or written <= 0:
|
|
140
|
+
raise FrameError("IPC transport write failed")
|
|
141
|
+
frame = frame[written:]
|
|
142
|
+
stream.flush()
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"""Resource write authorization from the existing local Kernel interaction ledger."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
from collections.abc import Callable
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
|
|
10
|
+
from ksadk.interaction.contracts import InteractionPresentation, InteractionRecord
|
|
11
|
+
from ksadk.kernel.contracts import ActivationWriteGuard
|
|
12
|
+
from ksadk.kernel.sqlite_store import SQLiteAgentKernelStore
|
|
13
|
+
from ksadk.resource_runtime.ipc import ResourceRequest
|
|
14
|
+
from ksadk.resource_runtime.leases import ResourceScope
|
|
15
|
+
from ksadk.resource_runtime.memory_provider import MemoryRecordSelector, MemoryUpdate, MemoryWrite
|
|
16
|
+
from ksadk.resource_runtime.skills import SkillExecutionQuery
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def approval_metadata(request: ResourceRequest, scope: ResourceScope, event_id: str) -> dict:
|
|
20
|
+
"""Host-only metadata for an InteractionRecord, before presenting approval.
|
|
21
|
+
|
|
22
|
+
No body or credentials are persisted here. Activation/transport IDs may change
|
|
23
|
+
on recovery; the bound identity, Build, operation and exact arguments may not.
|
|
24
|
+
"""
|
|
25
|
+
payload = {
|
|
26
|
+
"identity": scope.identity.model_dump(mode="json"),
|
|
27
|
+
"build": scope.build_digest,
|
|
28
|
+
"binding": scope.binding_id,
|
|
29
|
+
"snapshot": scope.binding_snapshot_digest,
|
|
30
|
+
"operation": request.operation,
|
|
31
|
+
"arguments": request.arguments,
|
|
32
|
+
}
|
|
33
|
+
digest = hashlib.sha256(
|
|
34
|
+
json.dumps(payload, sort_keys=True, separators=(",", ":"), allow_nan=False).encode()
|
|
35
|
+
).hexdigest()
|
|
36
|
+
return {"resourceApproval": {"version": 1, "eventId": event_id, "requestDigest": digest}}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class KernelResourceWriteAuthorizer:
|
|
40
|
+
"""Use the existing Kernel ledger; decisions remain owned by its ingress.
|
|
41
|
+
|
|
42
|
+
resolve_interaction maps a trusted runtime tool event to its interaction ID.
|
|
43
|
+
Never implement that mapping from model arguments or browser approval flags.
|
|
44
|
+
PostgreSQL/remote hosts need an equivalent committed-receipt adapter.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
def __init__(
|
|
48
|
+
self,
|
|
49
|
+
store: SQLiteAgentKernelStore,
|
|
50
|
+
*,
|
|
51
|
+
run_id: str,
|
|
52
|
+
resolve_interaction: Callable[[ResourceRequest, ResourceScope], str | None],
|
|
53
|
+
):
|
|
54
|
+
self.store = store
|
|
55
|
+
self.run_id = run_id
|
|
56
|
+
self.resolve_interaction = resolve_interaction
|
|
57
|
+
|
|
58
|
+
async def request_memory_approval(
|
|
59
|
+
self,
|
|
60
|
+
request: ResourceRequest,
|
|
61
|
+
scope: ResourceScope,
|
|
62
|
+
*,
|
|
63
|
+
interaction_id: str,
|
|
64
|
+
event_id: str,
|
|
65
|
+
guard: ActivationWriteGuard,
|
|
66
|
+
) -> InteractionRecord:
|
|
67
|
+
if request.operation != "save_memory":
|
|
68
|
+
raise ValueError("RESOURCE_SCOPE_DENIED")
|
|
69
|
+
return await self.request_write_approval(
|
|
70
|
+
request,
|
|
71
|
+
scope,
|
|
72
|
+
interaction_id=interaction_id,
|
|
73
|
+
event_id=event_id,
|
|
74
|
+
guard=guard,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
async def request_write_approval(
|
|
78
|
+
self,
|
|
79
|
+
request: ResourceRequest,
|
|
80
|
+
scope: ResourceScope,
|
|
81
|
+
*,
|
|
82
|
+
interaction_id: str,
|
|
83
|
+
event_id: str,
|
|
84
|
+
guard: ActivationWriteGuard,
|
|
85
|
+
) -> InteractionRecord:
|
|
86
|
+
"""Host-only creation, fenced by the existing Kernel activation lease.
|
|
87
|
+
|
|
88
|
+
Presentation contains the proposed operation so users can review the actual
|
|
89
|
+
write. It follows the host's existing interaction/transcript retention.
|
|
90
|
+
This method cannot submit an approval decision or execute a write.
|
|
91
|
+
"""
|
|
92
|
+
scope = ResourceScope.model_validate(scope.model_dump())
|
|
93
|
+
request = ResourceRequest.model_validate_json(request.model_dump_json())
|
|
94
|
+
if request.operation not in scope.allowed_operations:
|
|
95
|
+
raise ValueError("RESOURCE_SCOPE_DENIED")
|
|
96
|
+
if request.operation == "save_memory":
|
|
97
|
+
content = MemoryWrite.model_validate(request.arguments).content
|
|
98
|
+
title = "保存长期记忆"
|
|
99
|
+
elif request.operation == "update_memory":
|
|
100
|
+
update = MemoryUpdate.model_validate(request.arguments)
|
|
101
|
+
if not update.content.strip():
|
|
102
|
+
raise ValueError("RESOURCE_APPROVAL_REQUEST_INVALID")
|
|
103
|
+
content = update.memory_id + "\n\n" + update.content
|
|
104
|
+
title = "更新长期记忆"
|
|
105
|
+
elif request.operation == "delete_memory":
|
|
106
|
+
content = MemoryRecordSelector.model_validate(request.arguments).memory_id
|
|
107
|
+
title = "删除长期记忆(软删除)"
|
|
108
|
+
elif request.operation == "execute_skills":
|
|
109
|
+
execution = SkillExecutionQuery.model_validate(request.arguments)
|
|
110
|
+
if not execution.workflow_prompt.strip():
|
|
111
|
+
raise ValueError("RESOURCE_APPROVAL_REQUEST_INVALID")
|
|
112
|
+
content = ", ".join(execution.skill_ids) + "\n\n" + execution.workflow_prompt
|
|
113
|
+
title = "执行锁定 Skill"
|
|
114
|
+
else:
|
|
115
|
+
raise ValueError("RESOURCE_APPROVAL_OPERATION_UNSUPPORTED")
|
|
116
|
+
if not content.strip() or not isinstance(event_id, str) or not 0 < len(event_id) <= 1024:
|
|
117
|
+
raise ValueError("RESOURCE_APPROVAL_REQUEST_INVALID")
|
|
118
|
+
record = InteractionRecord(
|
|
119
|
+
interaction_id=interaction_id,
|
|
120
|
+
tenant_id=scope.identity.tenant_ref,
|
|
121
|
+
agent_instance_id=scope.identity.agent_id,
|
|
122
|
+
session_id=scope.identity.session_ref,
|
|
123
|
+
run_id=self.run_id,
|
|
124
|
+
kind="approval",
|
|
125
|
+
request_schema={"type": "object", "properties": {}, "additionalProperties": False},
|
|
126
|
+
created_at=datetime.now(timezone.utc).isoformat(),
|
|
127
|
+
provider_id="platform-resources",
|
|
128
|
+
presentation=InteractionPresentation(
|
|
129
|
+
title=title,
|
|
130
|
+
description=content,
|
|
131
|
+
),
|
|
132
|
+
continuation_metadata=approval_metadata(request, scope, event_id),
|
|
133
|
+
)
|
|
134
|
+
return await self.store.request(record, guard=guard)
|
|
135
|
+
|
|
136
|
+
async def authorize(self, request: ResourceRequest, scope: ResourceScope) -> str | None:
|
|
137
|
+
interaction_id = self.resolve_interaction(request, scope)
|
|
138
|
+
if not interaction_id:
|
|
139
|
+
return None
|
|
140
|
+
lookup = {
|
|
141
|
+
"tenant_id": scope.identity.tenant_ref,
|
|
142
|
+
"agent_instance_id": scope.identity.agent_id,
|
|
143
|
+
"session_id": scope.identity.session_ref,
|
|
144
|
+
"run_id": self.run_id,
|
|
145
|
+
}
|
|
146
|
+
record = await self.store.get(interaction_id, **lookup)
|
|
147
|
+
if record is None or record.kind != "approval" or record.status != "resolved":
|
|
148
|
+
return None
|
|
149
|
+
receipt = await self.store.get_terminal_receipt(interaction_id, **lookup)
|
|
150
|
+
if (
|
|
151
|
+
receipt is None
|
|
152
|
+
or receipt.outcome != "approved"
|
|
153
|
+
or receipt.revision != record.revision
|
|
154
|
+
or not receipt.event_id
|
|
155
|
+
):
|
|
156
|
+
return None
|
|
157
|
+
metadata = (record.continuation_metadata or {}).get("resourceApproval")
|
|
158
|
+
if not isinstance(metadata, dict):
|
|
159
|
+
return None
|
|
160
|
+
event_id = metadata.get("eventId")
|
|
161
|
+
if not isinstance(event_id, str) or not 0 < len(event_id) <= 1024:
|
|
162
|
+
return None
|
|
163
|
+
if metadata != approval_metadata(request, scope, event_id)["resourceApproval"]:
|
|
164
|
+
return None
|
|
165
|
+
return event_id
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""Bound knowledge retrieval, owned by one resource worker activation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from threading import Lock
|
|
6
|
+
from typing import Literal
|
|
7
|
+
|
|
8
|
+
from pydantic import Field
|
|
9
|
+
|
|
10
|
+
from ksadk.knowledge_base.client import KnowledgeBaseClient
|
|
11
|
+
from ksadk.plugins.contracts import PluginContractModel
|
|
12
|
+
from ksadk.resource_runtime.contracts import ResourceConfig, RetrievalPolicy
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class KnowledgeQuery(PluginContractModel):
|
|
16
|
+
query: str = Field(strict=True, min_length=1, max_length=16000)
|
|
17
|
+
top_k: int | None = Field(default=None, strict=True, ge=1)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class KnowledgeItem(PluginContractModel):
|
|
21
|
+
document_id: str = Field(max_length=4096)
|
|
22
|
+
document_name: str = Field(max_length=4096)
|
|
23
|
+
segment_id: str = Field(max_length=4096)
|
|
24
|
+
content: str
|
|
25
|
+
score: float = Field(allow_inf_nan=False)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class KnowledgeReply(PluginContractModel):
|
|
29
|
+
status: Literal["ok", "empty", "failed"]
|
|
30
|
+
binding_id: str
|
|
31
|
+
items: tuple[KnowledgeItem, ...] = ()
|
|
32
|
+
truncated: bool = False
|
|
33
|
+
request_id: str = Field(default="", max_length=256)
|
|
34
|
+
error_code: Literal["KNOWLEDGE_RETRIEVAL_FAILED", "RESOURCE_FORBIDDEN"] | None = None
|
|
35
|
+
|
|
36
|
+
def text(self) -> str:
|
|
37
|
+
if self.status == "failed":
|
|
38
|
+
return "Knowledge retrieval failed."
|
|
39
|
+
if self.status == "empty":
|
|
40
|
+
return "No matching knowledge found."
|
|
41
|
+
return "\n\n".join(
|
|
42
|
+
f"[{item.document_name or item.document_id}] {item.content}" for item in self.items
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class BoundKnowledgeService:
|
|
47
|
+
"""The worker owns this service and its client exclusively.
|
|
48
|
+
|
|
49
|
+
The lock includes both the blocking SDK call and copying its mutable
|
|
50
|
+
last_* fields. IPC concurrency must not interleave those two steps.
|
|
51
|
+
Identity/lease authorization occurs in the broker before this service.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def __init__(self, config: ResourceConfig, client: KnowledgeBaseClient):
|
|
55
|
+
resource = config.binding.resource
|
|
56
|
+
if resource.kind != "knowledge-base":
|
|
57
|
+
raise ValueError("Knowledge service requires a knowledge-base binding")
|
|
58
|
+
if client.dataset_id != resource.id or client.region != resource.region:
|
|
59
|
+
raise ValueError("Knowledge client does not match its frozen binding")
|
|
60
|
+
self._config = config
|
|
61
|
+
self._client = client
|
|
62
|
+
self._lock = Lock()
|
|
63
|
+
|
|
64
|
+
def search(self, arguments: dict) -> KnowledgeReply:
|
|
65
|
+
query = KnowledgeQuery.model_validate(arguments)
|
|
66
|
+
policy = self._config.retrieval or RetrievalPolicy()
|
|
67
|
+
top_k = min(query.top_k if query.top_k is not None else policy.top_k, policy.top_k)
|
|
68
|
+
with self._lock:
|
|
69
|
+
try:
|
|
70
|
+
records = self._client.search(query.query, top_k=top_k)
|
|
71
|
+
if self._client.last_error:
|
|
72
|
+
return self._failed()
|
|
73
|
+
budget = policy.max_chars
|
|
74
|
+
items = []
|
|
75
|
+
truncated = len(records) > top_k
|
|
76
|
+
for record in records[:top_k]:
|
|
77
|
+
if budget == 0:
|
|
78
|
+
truncated = True
|
|
79
|
+
break
|
|
80
|
+
content = record.content[:budget]
|
|
81
|
+
truncated = truncated or len(content) < len(record.content)
|
|
82
|
+
budget -= len(content)
|
|
83
|
+
items.append(
|
|
84
|
+
KnowledgeItem(
|
|
85
|
+
document_id=record.document_id,
|
|
86
|
+
document_name=record.document_name,
|
|
87
|
+
segment_id=record.segment_id,
|
|
88
|
+
content=content,
|
|
89
|
+
score=record.score,
|
|
90
|
+
)
|
|
91
|
+
)
|
|
92
|
+
return KnowledgeReply(
|
|
93
|
+
status="ok" if records else "empty",
|
|
94
|
+
binding_id=self._config.binding.id,
|
|
95
|
+
items=tuple(items),
|
|
96
|
+
truncated=truncated,
|
|
97
|
+
request_id=self._client.last_request_id,
|
|
98
|
+
)
|
|
99
|
+
except Exception:
|
|
100
|
+
# Raw upstream exceptions may include credentials, signed URLs or
|
|
101
|
+
# knowledge text. Only the fixed public failure code crosses IPC.
|
|
102
|
+
return self._failed()
|
|
103
|
+
|
|
104
|
+
def _failed(self) -> KnowledgeReply:
|
|
105
|
+
return KnowledgeReply(
|
|
106
|
+
status="failed",
|
|
107
|
+
binding_id=self._config.binding.id,
|
|
108
|
+
request_id=self._client.last_request_id,
|
|
109
|
+
error_code=(
|
|
110
|
+
"RESOURCE_FORBIDDEN"
|
|
111
|
+
if self._client.last_http_status in {401, 403}
|
|
112
|
+
else "KNOWLEDGE_RETRIEVAL_FAILED"
|
|
113
|
+
),
|
|
114
|
+
)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""Explicit LangGraph tools backed by the existing Core's scoped MCP endpoint.
|
|
2
|
+
|
|
3
|
+
The trusted runner supplies admitted leases and owns this async context for the
|
|
4
|
+
whole graph invocation. Never put the connector, leases or session in graph
|
|
5
|
+
state/checkpoints. This does not mutate compiled graphs or supply memory hooks.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
from collections.abc import AsyncIterator, Mapping, Sequence
|
|
11
|
+
from contextlib import asynccontextmanager
|
|
12
|
+
|
|
13
|
+
import httpx
|
|
14
|
+
from langchain_core.tools import BaseTool, StructuredTool, ToolException
|
|
15
|
+
from mcp import ClientSession
|
|
16
|
+
from mcp.client.streamable_http import streamable_http_client
|
|
17
|
+
|
|
18
|
+
from ksadk.plugins.providers.dsh_capabilities import DshMcpConnectorLease
|
|
19
|
+
from ksadk.resource_runtime.leases import ResourceLease
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@asynccontextmanager
|
|
23
|
+
async def create_bound_resource_tools(
|
|
24
|
+
connector: DshMcpConnectorLease,
|
|
25
|
+
leases: Sequence[ResourceLease],
|
|
26
|
+
*,
|
|
27
|
+
tool_aliases: Mapping[str, str],
|
|
28
|
+
) -> AsyncIterator[tuple[BaseTool, ...]]:
|
|
29
|
+
"""Open scoped tools for explicit graph factory/ToolNode/model.bind_tools use.
|
|
30
|
+
|
|
31
|
+
Uses the installed MCP SDK transport and LangChain tool contract. Closing the
|
|
32
|
+
context invalidates escaped tools. Renewal requires reopening at a safe graph
|
|
33
|
+
boundary with fresh host-issued leases; this helper cannot grant permissions.
|
|
34
|
+
Writes still require the broker's host approval/event authorizer.
|
|
35
|
+
"""
|
|
36
|
+
aliases = dict(tool_aliases)
|
|
37
|
+
token = connector.resource_bearer_token(aliases, leases)
|
|
38
|
+
opened = False
|
|
39
|
+
async with httpx.AsyncClient(
|
|
40
|
+
headers={"Authorization": "Bearer " + token},
|
|
41
|
+
trust_env=False,
|
|
42
|
+
follow_redirects=False,
|
|
43
|
+
timeout=httpx.Timeout(60, connect=10),
|
|
44
|
+
) as client:
|
|
45
|
+
async with streamable_http_client(connector.endpoint, http_client=client) as streams:
|
|
46
|
+
async with ClientSession(streams[0], streams[1]) as session:
|
|
47
|
+
await session.initialize()
|
|
48
|
+
inventory = await session.list_tools()
|
|
49
|
+
by_name = {tool.name: tool for tool in inventory.tools}
|
|
50
|
+
if (
|
|
51
|
+
inventory.nextCursor
|
|
52
|
+
or len(by_name) != len(inventory.tools)
|
|
53
|
+
or set(by_name) != set(aliases)
|
|
54
|
+
):
|
|
55
|
+
raise RuntimeError("RESOURCE_TOOL_INVENTORY_MISMATCH")
|
|
56
|
+
opened = True
|
|
57
|
+
tools = []
|
|
58
|
+
|
|
59
|
+
def make_tool(name):
|
|
60
|
+
descriptor = by_name[name]
|
|
61
|
+
|
|
62
|
+
async def invoke(**arguments):
|
|
63
|
+
if not opened:
|
|
64
|
+
raise ToolException("RESOURCE_SESSION_CLOSED")
|
|
65
|
+
try:
|
|
66
|
+
result = await session.call_tool(name, arguments)
|
|
67
|
+
except Exception:
|
|
68
|
+
raise ToolException("RESOURCE_MCP_CALL_FAILED") from None
|
|
69
|
+
payload = result.model_dump(mode="json", by_alias=True, exclude_none=True)
|
|
70
|
+
if result.isError:
|
|
71
|
+
# Preserve structured diagnostics and tell ToolNode the
|
|
72
|
+
# call failed. Never return a failed business call as success.
|
|
73
|
+
raise ToolException(json.dumps(payload, ensure_ascii=False))
|
|
74
|
+
content = "\n".join(
|
|
75
|
+
item.text for item in result.content if item.type == "text"
|
|
76
|
+
)
|
|
77
|
+
return content, payload
|
|
78
|
+
|
|
79
|
+
return StructuredTool.from_function(
|
|
80
|
+
coroutine=invoke,
|
|
81
|
+
name=name,
|
|
82
|
+
description=descriptor.description or name,
|
|
83
|
+
args_schema=descriptor.inputSchema,
|
|
84
|
+
infer_schema=False,
|
|
85
|
+
response_format="content_and_artifact",
|
|
86
|
+
handle_tool_error=True,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
for name in aliases:
|
|
91
|
+
tools.append(make_tool(name))
|
|
92
|
+
yield tuple(tools)
|
|
93
|
+
finally:
|
|
94
|
+
opened = False
|