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,504 @@
|
|
|
1
|
+
"""Private resource worker entry point. Initialization arrives on a trusted pipe."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import sys
|
|
7
|
+
import time
|
|
8
|
+
from dataclasses import asdict
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import ClassVar
|
|
11
|
+
from urllib.parse import urlsplit
|
|
12
|
+
|
|
13
|
+
import httpx
|
|
14
|
+
from pydantic import ConfigDict, Field, SecretStr, model_validator
|
|
15
|
+
from requests.exceptions import RequestException
|
|
16
|
+
|
|
17
|
+
from ksadk.knowledge_base.client import KnowledgeBaseClient
|
|
18
|
+
from ksadk.memory.adk.backends.sdk_ltm_backend import SdkLTMBackend
|
|
19
|
+
from ksadk.memory.models import MemorySearchRequest
|
|
20
|
+
from ksadk.plugins.contracts import PluginContractModel
|
|
21
|
+
from ksadk.resource_runtime.build_artifacts import ResourceBuildReference
|
|
22
|
+
from ksadk.resource_runtime.contracts import (
|
|
23
|
+
Identifier,
|
|
24
|
+
InvocationIdentity,
|
|
25
|
+
ResourceConfig,
|
|
26
|
+
validate_resource_bindings,
|
|
27
|
+
)
|
|
28
|
+
from ksadk.resource_runtime.discovery_receipts import DiscoverySkillReceipt, discovery_scope_key
|
|
29
|
+
from ksadk.resource_runtime.discovery_skills import DiscoverySkillService
|
|
30
|
+
from ksadk.resource_runtime.errors import ResourceUpstreamAuthorizationError
|
|
31
|
+
from ksadk.resource_runtime.ipc import ResourceRequest, read_frame, write_frame
|
|
32
|
+
from ksadk.resource_runtime.knowledge import BoundKnowledgeService
|
|
33
|
+
from ksadk.resource_runtime.leases import ResourceScope
|
|
34
|
+
from ksadk.resource_runtime.memory_provider import AicpMemoryProvider, MemoryQuery
|
|
35
|
+
from ksadk.resource_runtime.skill_runtime import create_bound_skill_runtime
|
|
36
|
+
from ksadk.resource_runtime.skills import PinnedSkillService
|
|
37
|
+
from ksadk.resource_runtime.snapshots import ConnectionTarget, MemoryRecallPolicy, ResourceSnapshot
|
|
38
|
+
from ksadk.skills.package_store import SkillPackageError
|
|
39
|
+
from ksadk.skills.service_client import SkillServiceClient
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class ExplicitWorkerBinding(PluginContractModel):
|
|
43
|
+
resource_kind: ClassVar[str] = ""
|
|
44
|
+
model_config = ConfigDict(hide_input_in_errors=True)
|
|
45
|
+
config: ResourceConfig
|
|
46
|
+
endpoint: str
|
|
47
|
+
access_key: SecretStr = Field(min_length=1)
|
|
48
|
+
secret_key: SecretStr = Field(min_length=1)
|
|
49
|
+
session_token: SecretStr = SecretStr("")
|
|
50
|
+
|
|
51
|
+
@model_validator(mode="after")
|
|
52
|
+
def explicit_connection(self) -> ExplicitWorkerBinding:
|
|
53
|
+
url = urlsplit(self.endpoint)
|
|
54
|
+
if (
|
|
55
|
+
url.scheme not in {"http", "https"}
|
|
56
|
+
or not url.hostname
|
|
57
|
+
or url.username is not None
|
|
58
|
+
or url.password is not None
|
|
59
|
+
or url.query
|
|
60
|
+
or url.fragment
|
|
61
|
+
or url.path not in {"", "/"}
|
|
62
|
+
or any(char.isspace() for char in self.endpoint)
|
|
63
|
+
):
|
|
64
|
+
raise ValueError("Worker requires an explicit service endpoint")
|
|
65
|
+
if self.config.binding.resource.kind != self.resource_kind:
|
|
66
|
+
raise ValueError("Worker binding resource kind does not match service")
|
|
67
|
+
return self
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class KnowledgeWorkerBinding(ExplicitWorkerBinding):
|
|
71
|
+
resource_kind: ClassVar[str] = "knowledge-base"
|
|
72
|
+
|
|
73
|
+
def create_service(self) -> BoundKnowledgeService:
|
|
74
|
+
endpoint = urlsplit(self.endpoint)
|
|
75
|
+
client = KnowledgeBaseClient(
|
|
76
|
+
dataset_id=self.config.binding.resource.id,
|
|
77
|
+
region=self.config.binding.resource.region,
|
|
78
|
+
endpoint=endpoint.netloc,
|
|
79
|
+
scheme=endpoint.scheme,
|
|
80
|
+
access_key=self.access_key.get_secret_value(),
|
|
81
|
+
secret_key=self.secret_key.get_secret_value(),
|
|
82
|
+
session_token=self.session_token.get_secret_value(),
|
|
83
|
+
)
|
|
84
|
+
return BoundKnowledgeService(self.config, client)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class MemoryWorkerBinding(ExplicitWorkerBinding):
|
|
88
|
+
resource_kind: ClassVar[str] = "memory-instance"
|
|
89
|
+
|
|
90
|
+
def create_provider(self, identity: InvocationIdentity) -> AicpMemoryProvider:
|
|
91
|
+
endpoint = urlsplit(self.endpoint)
|
|
92
|
+
backend = SdkLTMBackend(
|
|
93
|
+
index="bound-resource",
|
|
94
|
+
memory_collection_id=self.config.binding.resource.id,
|
|
95
|
+
namespace=self.config.binding.resource.id,
|
|
96
|
+
agent_id=identity.agent_id,
|
|
97
|
+
region=self.config.binding.resource.region,
|
|
98
|
+
endpoint=endpoint.netloc,
|
|
99
|
+
scheme=endpoint.scheme,
|
|
100
|
+
access_key=self.access_key.get_secret_value(),
|
|
101
|
+
secret_key=self.secret_key.get_secret_value(),
|
|
102
|
+
session_token=self.session_token.get_secret_value(),
|
|
103
|
+
)
|
|
104
|
+
return AicpMemoryProvider(self.config, identity, backend)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class DiscoverySkillWorkerBinding(ExplicitWorkerBinding):
|
|
108
|
+
resource_kind: ClassVar[str] = "skill-space"
|
|
109
|
+
cache_directory: Path
|
|
110
|
+
selection_run_ref: Identifier
|
|
111
|
+
restored_selections: tuple[DiscoverySkillReceipt, ...] = Field(default=(), max_length=32)
|
|
112
|
+
execution_connection: ConnectionTarget | None = None
|
|
113
|
+
execution_api_key: SecretStr | None = Field(default=None, repr=False)
|
|
114
|
+
artifact_directory: Path | None = None
|
|
115
|
+
|
|
116
|
+
@model_validator(mode="after")
|
|
117
|
+
def discovery_only(self):
|
|
118
|
+
if (
|
|
119
|
+
self.config.selection_mode != "discovery"
|
|
120
|
+
or self.config.include_public
|
|
121
|
+
or self.session_token.get_secret_value()
|
|
122
|
+
or not self.cache_directory.is_absolute()
|
|
123
|
+
):
|
|
124
|
+
raise ValueError("Discovery Worker requires private-space signed configuration")
|
|
125
|
+
execution = (self.execution_connection, self.execution_api_key, self.artifact_directory)
|
|
126
|
+
if any(value is not None for value in execution) and (
|
|
127
|
+
any(value is None for value in execution)
|
|
128
|
+
or not self.execution_api_key.get_secret_value()
|
|
129
|
+
or not self.artifact_directory.is_absolute()
|
|
130
|
+
):
|
|
131
|
+
raise ValueError(
|
|
132
|
+
"Discovery execution requires complete explicit target and artifact root"
|
|
133
|
+
)
|
|
134
|
+
return self
|
|
135
|
+
|
|
136
|
+
def create_provider(
|
|
137
|
+
self, scope: ResourceScope, *, execution_target=None,
|
|
138
|
+
) -> DiscoverySkillService:
|
|
139
|
+
namespace = discovery_scope_key(scope, self.selection_run_ref)
|
|
140
|
+
client = SkillServiceClient(
|
|
141
|
+
base_url=self.endpoint,
|
|
142
|
+
access_key=self.access_key.get_secret_value(),
|
|
143
|
+
secret_key=self.secret_key.get_secret_value(),
|
|
144
|
+
region=self.config.binding.resource.region,
|
|
145
|
+
allow_env_fallback=False,
|
|
146
|
+
timeout=15,
|
|
147
|
+
)
|
|
148
|
+
return DiscoverySkillService(
|
|
149
|
+
self.config,
|
|
150
|
+
client,
|
|
151
|
+
cache_directory=self.cache_directory,
|
|
152
|
+
namespace=namespace,
|
|
153
|
+
restored_selections=self.restored_selections,
|
|
154
|
+
execution_target=execution_target,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def read_memory(
|
|
159
|
+
provider: AicpMemoryProvider,
|
|
160
|
+
arguments: dict,
|
|
161
|
+
policy: MemoryRecallPolicy | None = None,
|
|
162
|
+
) -> dict:
|
|
163
|
+
query = MemoryQuery.model_validate(arguments)
|
|
164
|
+
policy = MemoryRecallPolicy.model_validate((policy or MemoryRecallPolicy()).model_dump())
|
|
165
|
+
result = provider.search(
|
|
166
|
+
MemorySearchRequest(
|
|
167
|
+
query=query.query,
|
|
168
|
+
scopes=[("user", provider.partition)],
|
|
169
|
+
top_k=policy.top_k,
|
|
170
|
+
max_tokens=policy.max_tokens,
|
|
171
|
+
min_score=policy.min_score,
|
|
172
|
+
memory_types=[],
|
|
173
|
+
)
|
|
174
|
+
)
|
|
175
|
+
return asdict(result)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class PinnedSkillWorkerBinding(PluginContractModel):
|
|
179
|
+
model_config = ConfigDict(hide_input_in_errors=True)
|
|
180
|
+
config: ResourceConfig
|
|
181
|
+
build_directory: Path
|
|
182
|
+
build_reference: ResourceBuildReference
|
|
183
|
+
cache_directory: Path
|
|
184
|
+
execution_connection: ConnectionTarget | None = None
|
|
185
|
+
execution_api_key: SecretStr | None = Field(default=None, repr=False)
|
|
186
|
+
artifact_directory: Path | None = None
|
|
187
|
+
|
|
188
|
+
@model_validator(mode="after")
|
|
189
|
+
def pinned_only(self):
|
|
190
|
+
if (
|
|
191
|
+
self.config.binding.resource.kind != "skill-space"
|
|
192
|
+
or self.config.selection_mode == "discovery"
|
|
193
|
+
):
|
|
194
|
+
raise ValueError("Pinned Skill Worker requires pinned selection")
|
|
195
|
+
if not self.build_directory.is_absolute() or not self.cache_directory.is_absolute():
|
|
196
|
+
raise ValueError("Worker delivery paths must be absolute host paths")
|
|
197
|
+
execution_fields = (
|
|
198
|
+
self.execution_connection,
|
|
199
|
+
self.execution_api_key,
|
|
200
|
+
self.artifact_directory,
|
|
201
|
+
)
|
|
202
|
+
if any(item is not None for item in execution_fields):
|
|
203
|
+
if any(item is None for item in execution_fields):
|
|
204
|
+
raise ValueError(
|
|
205
|
+
"Skill execution requires connection, credential and artifact root"
|
|
206
|
+
)
|
|
207
|
+
if not self.execution_api_key.get_secret_value():
|
|
208
|
+
raise ValueError("Skill execution credential cannot be empty")
|
|
209
|
+
if not self.artifact_directory.is_absolute():
|
|
210
|
+
raise ValueError("Skill artifact root must be absolute")
|
|
211
|
+
return self
|
|
212
|
+
|
|
213
|
+
def create_service(self) -> PinnedSkillService:
|
|
214
|
+
return PinnedSkillService(
|
|
215
|
+
self.build_directory,
|
|
216
|
+
self.build_reference,
|
|
217
|
+
binding_id=self.config.binding.id,
|
|
218
|
+
cache_directory=self.cache_directory,
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
class WorkerInitialization(PluginContractModel):
|
|
223
|
+
model_config = ConfigDict(hide_input_in_errors=True)
|
|
224
|
+
resource_snapshot: ResourceSnapshot
|
|
225
|
+
bindings: tuple[
|
|
226
|
+
KnowledgeWorkerBinding
|
|
227
|
+
| MemoryWorkerBinding
|
|
228
|
+
| PinnedSkillWorkerBinding
|
|
229
|
+
| DiscoverySkillWorkerBinding,
|
|
230
|
+
...,
|
|
231
|
+
]
|
|
232
|
+
scopes: tuple[ResourceScope, ...]
|
|
233
|
+
|
|
234
|
+
@model_validator(mode="after")
|
|
235
|
+
def single_activation(self) -> WorkerInitialization:
|
|
236
|
+
if not self.bindings or not self.scopes:
|
|
237
|
+
raise ValueError("Worker initialization cannot be empty")
|
|
238
|
+
validate_resource_bindings(tuple(binding.config for binding in self.bindings))
|
|
239
|
+
binding_ids = {binding.config.binding.id for binding in self.bindings}
|
|
240
|
+
if binding_ids != {scope.binding_id for scope in self.scopes}:
|
|
241
|
+
raise ValueError("Worker scopes must exactly cover bindings")
|
|
242
|
+
if len(self.scopes) != len(binding_ids):
|
|
243
|
+
raise ValueError("Duplicate worker scope")
|
|
244
|
+
first = self.scopes[0]
|
|
245
|
+
if binding_ids != {item.config.binding.id for item in self.resource_snapshot.bindings}:
|
|
246
|
+
raise ValueError("Worker bindings must exactly match the Build resource snapshot")
|
|
247
|
+
for scope in self.scopes:
|
|
248
|
+
frozen = self.resource_snapshot.binding(scope.binding_id)
|
|
249
|
+
binding = next(
|
|
250
|
+
item for item in self.bindings if item.config.binding.id == scope.binding_id
|
|
251
|
+
)
|
|
252
|
+
if (
|
|
253
|
+
scope.binding_snapshot_digest != self.resource_snapshot.digest
|
|
254
|
+
or binding.config.digest != frozen.config.digest
|
|
255
|
+
):
|
|
256
|
+
raise ValueError("Worker resource configuration does not match Build")
|
|
257
|
+
if isinstance(binding, PinnedSkillWorkerBinding):
|
|
258
|
+
if (
|
|
259
|
+
binding.build_reference.snapshot_digest != self.resource_snapshot.digest
|
|
260
|
+
or frozen.connection.tenant_ref != scope.identity.tenant_ref
|
|
261
|
+
or frozen.connection.principal_ref != scope.identity.resource_principal_ref
|
|
262
|
+
):
|
|
263
|
+
raise ValueError(
|
|
264
|
+
"Pinned Skill Worker identity or snapshot does not match Build"
|
|
265
|
+
)
|
|
266
|
+
else:
|
|
267
|
+
self.resource_snapshot.verify_connection(
|
|
268
|
+
scope.binding_id,
|
|
269
|
+
ConnectionTarget(
|
|
270
|
+
connection_ref=binding.config.binding.connection_ref,
|
|
271
|
+
tenant_ref=scope.identity.tenant_ref,
|
|
272
|
+
principal_ref=scope.identity.resource_principal_ref,
|
|
273
|
+
endpoint=binding.endpoint,
|
|
274
|
+
auth_mode="sts" if binding.session_token.get_secret_value() else "signed",
|
|
275
|
+
),
|
|
276
|
+
)
|
|
277
|
+
if isinstance(binding, (PinnedSkillWorkerBinding, DiscoverySkillWorkerBinding)):
|
|
278
|
+
if binding.execution_connection is not None and (
|
|
279
|
+
frozen.skill_execution is None
|
|
280
|
+
or binding.execution_connection != frozen.skill_execution.connection
|
|
281
|
+
):
|
|
282
|
+
raise ValueError("Skill execution connection does not match Build")
|
|
283
|
+
if (
|
|
284
|
+
scope.identity != first.identity
|
|
285
|
+
or scope.activation_id != first.activation_id
|
|
286
|
+
or scope.generation_id != first.generation_id
|
|
287
|
+
or scope.profile_digest != first.profile_digest
|
|
288
|
+
or scope.build_digest != first.build_digest
|
|
289
|
+
or scope.binding_snapshot_digest != first.binding_snapshot_digest
|
|
290
|
+
):
|
|
291
|
+
raise ValueError("Worker scopes cannot mix activations or Builds")
|
|
292
|
+
supported = (
|
|
293
|
+
{"load_memory", "save_memory", "memory_status", "update_memory", "delete_memory"}
|
|
294
|
+
if isinstance(binding, MemoryWorkerBinding)
|
|
295
|
+
else {"search_knowledge_base"}
|
|
296
|
+
)
|
|
297
|
+
if isinstance(binding, DiscoverySkillWorkerBinding):
|
|
298
|
+
supported = {"list_skills", "search_skills", "load_skill", "read_skill_resource"}
|
|
299
|
+
if binding.execution_connection is not None:
|
|
300
|
+
supported.update({"execute_skills", "read_skill_artifact"})
|
|
301
|
+
if isinstance(binding, PinnedSkillWorkerBinding):
|
|
302
|
+
supported = {
|
|
303
|
+
"list_skills",
|
|
304
|
+
"search_skills",
|
|
305
|
+
"load_skill",
|
|
306
|
+
"read_skill_resource",
|
|
307
|
+
"read_skill_artifact",
|
|
308
|
+
}
|
|
309
|
+
if binding.execution_connection is not None:
|
|
310
|
+
supported.add("execute_skills")
|
|
311
|
+
if not set(scope.allowed_operations) <= supported:
|
|
312
|
+
raise ValueError("Unsupported worker operation")
|
|
313
|
+
return self
|
|
314
|
+
|
|
315
|
+
def pipe_payload(self) -> dict:
|
|
316
|
+
"""Credential-bearing data for the private child stdin only; never persist."""
|
|
317
|
+
payload = self.model_dump(by_alias=True, mode="json")
|
|
318
|
+
for raw, binding in zip(payload["bindings"], self.bindings):
|
|
319
|
+
if isinstance(binding, (PinnedSkillWorkerBinding, DiscoverySkillWorkerBinding)):
|
|
320
|
+
if binding.execution_api_key is not None:
|
|
321
|
+
raw["executionApiKey"] = binding.execution_api_key.get_secret_value()
|
|
322
|
+
if isinstance(binding, PinnedSkillWorkerBinding):
|
|
323
|
+
continue
|
|
324
|
+
raw["accessKey"] = binding.access_key.get_secret_value()
|
|
325
|
+
raw["secretKey"] = binding.secret_key.get_secret_value()
|
|
326
|
+
raw["sessionToken"] = binding.session_token.get_secret_value()
|
|
327
|
+
return payload
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def main() -> int:
|
|
331
|
+
logging.disable(logging.CRITICAL)
|
|
332
|
+
source, target = sys.stdin.buffer, sys.stdout.buffer
|
|
333
|
+
try:
|
|
334
|
+
initialization = WorkerInitialization.model_validate(read_frame(source))
|
|
335
|
+
scopes = {scope.binding_id: scope for scope in initialization.scopes}
|
|
336
|
+
services = {
|
|
337
|
+
binding.config.binding.id: (
|
|
338
|
+
binding.create_provider(
|
|
339
|
+
scopes[binding.config.binding.id],
|
|
340
|
+
execution_target=initialization.resource_snapshot.binding(
|
|
341
|
+
binding.config.binding.id
|
|
342
|
+
).skill_execution,
|
|
343
|
+
)
|
|
344
|
+
if isinstance(binding, DiscoverySkillWorkerBinding)
|
|
345
|
+
else binding.create_provider(scopes[binding.config.binding.id].identity)
|
|
346
|
+
if isinstance(binding, MemoryWorkerBinding)
|
|
347
|
+
else binding.create_service()
|
|
348
|
+
)
|
|
349
|
+
for binding in initialization.bindings
|
|
350
|
+
}
|
|
351
|
+
skill_runtimes = {}
|
|
352
|
+
for binding in initialization.bindings:
|
|
353
|
+
if isinstance(binding, (PinnedSkillWorkerBinding, DiscoverySkillWorkerBinding)) and (
|
|
354
|
+
binding.execution_connection is not None
|
|
355
|
+
):
|
|
356
|
+
root = binding.artifact_directory
|
|
357
|
+
root.mkdir(mode=0o700, parents=True, exist_ok=True)
|
|
358
|
+
if root.is_symlink() or root.stat().st_mode & 0o077:
|
|
359
|
+
raise ValueError("Skill artifact root must be private")
|
|
360
|
+
skill_runtimes[binding.config.binding.id] = create_bound_skill_runtime(
|
|
361
|
+
initialization.resource_snapshot,
|
|
362
|
+
binding.config.binding.id,
|
|
363
|
+
current_connection=binding.execution_connection,
|
|
364
|
+
api_key=binding.execution_api_key,
|
|
365
|
+
artifact_directory=root.resolve(),
|
|
366
|
+
)
|
|
367
|
+
skill_runtimes[binding.config.binding.id].preflight()
|
|
368
|
+
write_frame(target, {"status": "ready"})
|
|
369
|
+
except Exception:
|
|
370
|
+
write_frame(target, {"error": {"code": "RESOURCE_WORKER_INITIALIZATION_FAILED"}})
|
|
371
|
+
return 1
|
|
372
|
+
revoked_bindings: set[str] = set()
|
|
373
|
+
while True:
|
|
374
|
+
try:
|
|
375
|
+
message = read_frame(source)
|
|
376
|
+
if message is None:
|
|
377
|
+
return 0
|
|
378
|
+
if set(message) != {"request", "scope"}:
|
|
379
|
+
raise ValueError("Invalid worker message")
|
|
380
|
+
request = ResourceRequest.model_validate(message["request"])
|
|
381
|
+
scope = ResourceScope.model_validate(message["scope"])
|
|
382
|
+
if scopes.get(scope.binding_id) != scope:
|
|
383
|
+
raise ValueError("Scope does not match worker initialization")
|
|
384
|
+
if request.deadline / 1000 <= time.time():
|
|
385
|
+
raise ValueError("Request deadline exceeded")
|
|
386
|
+
if request.check_only or request.operation not in scope.allowed_operations:
|
|
387
|
+
raise ValueError("Unsupported worker operation")
|
|
388
|
+
if scope.binding_id in revoked_bindings:
|
|
389
|
+
raise ResourceUpstreamAuthorizationError()
|
|
390
|
+
service = services[scope.binding_id]
|
|
391
|
+
if request.operation == "load_memory" and isinstance(service, AicpMemoryProvider):
|
|
392
|
+
reply = read_memory(
|
|
393
|
+
service,
|
|
394
|
+
request.arguments,
|
|
395
|
+
initialization.resource_snapshot.binding(scope.binding_id).memory_recall,
|
|
396
|
+
)
|
|
397
|
+
elif request.operation == "save_memory" and isinstance(service, AicpMemoryProvider):
|
|
398
|
+
reply = service.submit(request.arguments, operation_id=request.request_id)
|
|
399
|
+
elif request.operation == "memory_status" and isinstance(service, AicpMemoryProvider):
|
|
400
|
+
reply = service.extraction_status(request.arguments)
|
|
401
|
+
elif request.operation in {"update_memory", "delete_memory"} and isinstance(
|
|
402
|
+
service, AicpMemoryProvider
|
|
403
|
+
):
|
|
404
|
+
reply = service.mutate(
|
|
405
|
+
request.operation,
|
|
406
|
+
request.arguments,
|
|
407
|
+
operation_id=request.request_id,
|
|
408
|
+
)
|
|
409
|
+
elif request.operation == "search_knowledge_base":
|
|
410
|
+
reply = service.search(request.arguments).model_dump(by_alias=True, mode="json")
|
|
411
|
+
elif isinstance(service, PinnedSkillService):
|
|
412
|
+
if request.operation == "execute_skills":
|
|
413
|
+
try:
|
|
414
|
+
arguments = dict(request.arguments)
|
|
415
|
+
execution_kwargs = {}
|
|
416
|
+
if isinstance(service, DiscoverySkillService):
|
|
417
|
+
execution_kwargs["approved_selections"] = tuple(
|
|
418
|
+
DiscoverySkillReceipt.model_validate(item)
|
|
419
|
+
for item in arguments.pop("_hostSelections", [])
|
|
420
|
+
)
|
|
421
|
+
execution = service.execute(
|
|
422
|
+
arguments,
|
|
423
|
+
backend=skill_runtimes[scope.binding_id],
|
|
424
|
+
operation_id=request.request_id,
|
|
425
|
+
timeout=max(
|
|
426
|
+
1, min(900, int(request.deadline / 1000 - time.time()) - 2)
|
|
427
|
+
),
|
|
428
|
+
**execution_kwargs,
|
|
429
|
+
)
|
|
430
|
+
# Only the broker consumes these private paths. stdout/stderr
|
|
431
|
+
# may contain secrets or host paths and never cross this boundary.
|
|
432
|
+
known_outcome = (
|
|
433
|
+
execution.exit_code is not None
|
|
434
|
+
and not execution.timed_out
|
|
435
|
+
and not execution.error_type
|
|
436
|
+
)
|
|
437
|
+
reply = {
|
|
438
|
+
"operationId": request.request_id,
|
|
439
|
+
"status": (
|
|
440
|
+
"succeeded"
|
|
441
|
+
if execution.ok
|
|
442
|
+
else "failed"
|
|
443
|
+
if known_outcome
|
|
444
|
+
else "unknown"
|
|
445
|
+
),
|
|
446
|
+
"outputFiles": execution.output_files if known_outcome else [],
|
|
447
|
+
}
|
|
448
|
+
except Exception:
|
|
449
|
+
reply = {
|
|
450
|
+
"operationId": request.request_id,
|
|
451
|
+
"status": "unknown",
|
|
452
|
+
"outputFiles": [],
|
|
453
|
+
}
|
|
454
|
+
write_frame(target, {"requestId": request.request_id, "result": reply})
|
|
455
|
+
continue
|
|
456
|
+
handlers = {
|
|
457
|
+
"list_skills": service.list_skills,
|
|
458
|
+
"search_skills": service.search_skills,
|
|
459
|
+
"load_skill": service.load_skill,
|
|
460
|
+
"read_skill_resource": service.read_resource,
|
|
461
|
+
}
|
|
462
|
+
try:
|
|
463
|
+
reply = handlers[request.operation](request.arguments)
|
|
464
|
+
except (httpx.HTTPError, RequestException) as error:
|
|
465
|
+
response = getattr(error, "response", None)
|
|
466
|
+
if response is not None and response.status_code in {401, 403}:
|
|
467
|
+
raise ResourceUpstreamAuthorizationError() from None
|
|
468
|
+
reply = {"status": "failed", "errorCode": "SKILL_RESOURCE_UNAVAILABLE"}
|
|
469
|
+
except (ValueError, OSError, SkillPackageError):
|
|
470
|
+
reply = {"status": "failed", "errorCode": "SKILL_RESOURCE_UNAVAILABLE"}
|
|
471
|
+
if (
|
|
472
|
+
isinstance(service, DiscoverySkillService)
|
|
473
|
+
and request.operation in {"load_skill", "read_skill_resource"}
|
|
474
|
+
and reply.get("status") == "ok"
|
|
475
|
+
):
|
|
476
|
+
reply["_discoverySelection"] = DiscoverySkillReceipt.from_ref(
|
|
477
|
+
service._selected[reply["skillId"]]
|
|
478
|
+
).model_dump(by_alias=True, mode="json")
|
|
479
|
+
else:
|
|
480
|
+
raise ValueError("Unsupported worker service")
|
|
481
|
+
if reply.get("errorCode", reply.get("error_code")) == "RESOURCE_FORBIDDEN":
|
|
482
|
+
revoked_bindings.add(scope.binding_id)
|
|
483
|
+
write_frame(
|
|
484
|
+
target,
|
|
485
|
+
{
|
|
486
|
+
"requestId": request.request_id,
|
|
487
|
+
"result": reply,
|
|
488
|
+
},
|
|
489
|
+
)
|
|
490
|
+
except ResourceUpstreamAuthorizationError:
|
|
491
|
+
revoked_bindings.add(scope.binding_id)
|
|
492
|
+
write_frame(target, {
|
|
493
|
+
"requestId": request.request_id,
|
|
494
|
+
"result": {"status": "unauthorized", "errorCode": "RESOURCE_FORBIDDEN"},
|
|
495
|
+
})
|
|
496
|
+
except Exception:
|
|
497
|
+
# Malformed transport or a protocol violation closes this worker.
|
|
498
|
+
# No exception text, credentials or request content enters stdout.
|
|
499
|
+
write_frame(target, {"error": {"code": "RESOURCE_WORKER_REQUEST_FAILED"}})
|
|
500
|
+
return 1
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
if __name__ == "__main__":
|
|
504
|
+
raise SystemExit(main())
|
|
@@ -23,6 +23,7 @@ if TYPE_CHECKING:
|
|
|
23
23
|
class _LangGraphStreamMixin:
|
|
24
24
|
async def stream(self, input_data: Dict[str, Any]) -> AsyncIterator[Dict[str, Any]]:
|
|
25
25
|
"""流式调用 LangGraph 图"""
|
|
26
|
+
await self.prepare_runtime_capabilities()
|
|
26
27
|
payload = dict(input_data)
|
|
27
28
|
payload.pop("_ksadk_force_graph_invoke", None)
|
|
28
29
|
session_id = payload.pop("session_id", None) or str(uuid.uuid4())[:8]
|
|
@@ -41,7 +42,10 @@ class _LangGraphStreamMixin:
|
|
|
41
42
|
payload["input"] = self._gateway_approval_follow_up_input()
|
|
42
43
|
resume_value = payload["input"]
|
|
43
44
|
checkpoint_ref = self._extract_langgraph_checkpoint_ref(payload)
|
|
44
|
-
native_context = self.build_native_context(
|
|
45
|
+
native_context = self.build_native_context(
|
|
46
|
+
payload.get("platform_context"),
|
|
47
|
+
context_schema=getattr(self._agent, "context_schema", None),
|
|
48
|
+
)
|
|
45
49
|
invoke_payload = dict(payload)
|
|
46
50
|
invoke_payload["session_id"] = session_id
|
|
47
51
|
if history:
|
|
@@ -66,7 +70,7 @@ class _LangGraphStreamMixin:
|
|
|
66
70
|
elif is_resume and not is_gateway_approval_resume:
|
|
67
71
|
# Keep the interrupt value intact for ``Command(resume=...)``;
|
|
68
72
|
# prepare-state hooks only shape fresh user turns.
|
|
69
|
-
state = resume_value
|
|
73
|
+
state = self._unwrap_resume_value(resume_value)
|
|
70
74
|
elif self._has_prepare_state_hook():
|
|
71
75
|
state = self._prepare_state_with_hook(
|
|
72
76
|
payload,
|
|
@@ -390,9 +394,28 @@ class _LangGraphStreamMixin:
|
|
|
390
394
|
output = event.get("data", {}).get("output", {})
|
|
391
395
|
if isinstance(output, dict) and "__interrupt__" in output:
|
|
392
396
|
emitted_non_text_event = True
|
|
397
|
+
# __interrupt__ 是 LangGraph 原始 Interrupt 对象列表,
|
|
398
|
+
# 直接 yield 会导致下游拿不到 tool_name/description(非 Mapping)。
|
|
399
|
+
# 用 _get_interrupt_info 从 state 提取结构化 interrupt_info,
|
|
400
|
+
# 与 406-412 的异常路径和 419-436 的 pending_approval 兜底一致。
|
|
401
|
+
_interrupt_info = {}
|
|
402
|
+
try:
|
|
403
|
+
_get_state = getattr(self._agent, "aget_state", None) or getattr(
|
|
404
|
+
self._agent, "get_state", None
|
|
405
|
+
)
|
|
406
|
+
if _get_state is not None:
|
|
407
|
+
_maybe_state = _get_state(config)
|
|
408
|
+
if inspect.isawaitable(_maybe_state):
|
|
409
|
+
_maybe_state = await _maybe_state
|
|
410
|
+
_interrupt_info = self._get_interrupt_info(_maybe_state)
|
|
411
|
+
except Exception:
|
|
412
|
+
_interrupt_info = {}
|
|
413
|
+
if not _interrupt_info:
|
|
414
|
+
# 取不到 state 时 fallback 到原始 __interrupt__(兼容旧行为)。
|
|
415
|
+
_interrupt_info = output["__interrupt__"]
|
|
393
416
|
yield {
|
|
394
417
|
"type": "interrupt",
|
|
395
|
-
"interrupt_info":
|
|
418
|
+
"interrupt_info": _interrupt_info,
|
|
396
419
|
"session_id": session_id,
|
|
397
420
|
}
|
|
398
421
|
return
|
|
@@ -553,7 +576,10 @@ class _LangGraphStreamMixin:
|
|
|
553
576
|
resume_interrupt_id = str(payload.pop("resume_interrupt_id", "") or "")
|
|
554
577
|
resume_value = payload.get("input")
|
|
555
578
|
checkpoint_ref = self._extract_langgraph_checkpoint_ref(payload)
|
|
556
|
-
native_context = self.build_native_context(
|
|
579
|
+
native_context = self.build_native_context(
|
|
580
|
+
payload.get("platform_context"),
|
|
581
|
+
context_schema=getattr(self._agent, "context_schema", None),
|
|
582
|
+
)
|
|
557
583
|
|
|
558
584
|
config = self._get_config(session_id)
|
|
559
585
|
if is_checkpoint_resume:
|
|
@@ -567,7 +593,7 @@ class _LangGraphStreamMixin:
|
|
|
567
593
|
if is_checkpoint_resume:
|
|
568
594
|
state = resume_value
|
|
569
595
|
elif is_resume:
|
|
570
|
-
state = resume_value
|
|
596
|
+
state = self._unwrap_resume_value(resume_value)
|
|
571
597
|
elif self._has_prepare_state_hook():
|
|
572
598
|
state = self._prepare_state_with_hook(payload, session_id, history)
|
|
573
599
|
else:
|
|
@@ -693,6 +719,47 @@ class _LangGraphStreamMixin:
|
|
|
693
719
|
(ckpt_config.get("configurable") or {}).get("checkpoint_id", "") or ""
|
|
694
720
|
)
|
|
695
721
|
if ckpt_id:
|
|
722
|
+
# Extract next_node from graph state so the
|
|
723
|
+
# projection layer can surface it in the REST
|
|
724
|
+
# checkpoint payload.
|
|
725
|
+
next_nodes_raw = (
|
|
726
|
+
ckpt_state.get("next")
|
|
727
|
+
if isinstance(ckpt_state, dict)
|
|
728
|
+
else getattr(ckpt_state, "next", None)
|
|
729
|
+
)
|
|
730
|
+
ckpt_next_node = ""
|
|
731
|
+
if isinstance(next_nodes_raw, str):
|
|
732
|
+
ckpt_next_node = next_nodes_raw.strip()
|
|
733
|
+
elif isinstance(next_nodes_raw, (list, tuple, set)):
|
|
734
|
+
ckpt_next_node = str(next(iter(next_nodes_raw)) or "").strip()
|
|
735
|
+
# Enrich source metadata with checkpoint
|
|
736
|
+
# capability (backend/scope/durable) so the
|
|
737
|
+
# projection layer does not fall back to unknown.
|
|
738
|
+
ckpt_capability = self.describe_checkpoint_capability()
|
|
739
|
+
ckpt_source_metadata: dict[str, Any] = {"checkpoint": True}
|
|
740
|
+
if isinstance(ckpt_capability, dict):
|
|
741
|
+
ckpt_is_terminal = not bool(ckpt_next_node)
|
|
742
|
+
ckpt_is_resumable = bool(
|
|
743
|
+
ckpt_capability.get("Supported")
|
|
744
|
+
and ckpt_next_node
|
|
745
|
+
and ckpt_capability.get("Scope") != "process_local"
|
|
746
|
+
)
|
|
747
|
+
ckpt_source_metadata["capability"] = {
|
|
748
|
+
"backend": str(ckpt_capability.get("Backend") or "unknown"),
|
|
749
|
+
"scope": str(ckpt_capability.get("Scope") or "unknown"),
|
|
750
|
+
"durable": bool(ckpt_capability.get("Durable", False)),
|
|
751
|
+
"is_terminal": ckpt_is_terminal,
|
|
752
|
+
"is_resumable": ckpt_is_resumable,
|
|
753
|
+
"resume_status": (
|
|
754
|
+
"resumable" if ckpt_is_resumable else "disabled"
|
|
755
|
+
),
|
|
756
|
+
"resume_disabled_reason": (
|
|
757
|
+
"该 checkpoint 已是终态;可选择更早恢复点重跑"
|
|
758
|
+
if ckpt_is_terminal
|
|
759
|
+
else str(ckpt_capability.get("Reason") or "")
|
|
760
|
+
),
|
|
761
|
+
**({"next_node": ckpt_next_node} if ckpt_next_node else {}),
|
|
762
|
+
}
|
|
696
763
|
ckpt_ref = {
|
|
697
764
|
"thread_id": str(
|
|
698
765
|
(ckpt_config.get("configurable") or {}).get(
|
|
@@ -701,6 +768,7 @@ class _LangGraphStreamMixin:
|
|
|
701
768
|
),
|
|
702
769
|
"checkpoint_ns": "",
|
|
703
770
|
"checkpoint_id": ckpt_id,
|
|
771
|
+
**({"next_node": ckpt_next_node} if ckpt_next_node else {}),
|
|
704
772
|
}
|
|
705
773
|
continuation_id = stable_item_id(
|
|
706
774
|
"langgraph",
|
|
@@ -729,7 +797,7 @@ class _LangGraphStreamMixin:
|
|
|
729
797
|
source=SourceRef(
|
|
730
798
|
framework="langgraph",
|
|
731
799
|
native_run_id=run_id,
|
|
732
|
-
metadata=
|
|
800
|
+
metadata=ckpt_source_metadata,
|
|
733
801
|
),
|
|
734
802
|
continuation_id=continuation_id,
|
|
735
803
|
continuation_kind="graph_checkpoint",
|