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
ksadk/studio/contracts.py
CHANGED
|
@@ -43,6 +43,28 @@ class Instructions(ContractModel):
|
|
|
43
43
|
task: str = Field(default="", max_length=32768)
|
|
44
44
|
|
|
45
45
|
|
|
46
|
+
class SoulDocument(ContractModel):
|
|
47
|
+
"""Reviewed identity/boundary source that compiles ahead of task prompts.
|
|
48
|
+
|
|
49
|
+
This is deliberately an immutable revision input, not a mutable memory
|
|
50
|
+
file. Runtime may read the compiled snapshot but cannot promote a new
|
|
51
|
+
SoulDocument from a conversation.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
schema_version: Literal["agentkit.soul/v1"] = "agentkit.soul/v1"
|
|
55
|
+
identity: str = Field(min_length=1, max_length=4096)
|
|
56
|
+
principles: list[str] = Field(default_factory=list, max_length=64)
|
|
57
|
+
boundaries: list[str] = Field(default_factory=list, max_length=64)
|
|
58
|
+
tone: str | None = Field(default=None, max_length=1024)
|
|
59
|
+
|
|
60
|
+
@field_validator("principles", "boundaries")
|
|
61
|
+
@classmethod
|
|
62
|
+
def validate_nonempty_items(cls, value: list[str]) -> list[str]:
|
|
63
|
+
if any(not item.strip() for item in value):
|
|
64
|
+
raise ValueError("soul principles and boundaries must not contain empty items")
|
|
65
|
+
return value
|
|
66
|
+
|
|
67
|
+
|
|
46
68
|
class ModelParameters(ContractModel):
|
|
47
69
|
# 三者 None=未配置:请求 payload 一律不携带该字段,使用服务端默认,
|
|
48
70
|
# 规避各模型族对 temperature/max_tokens 的硬约束(如 kimi 只接受默认温度)。
|
|
@@ -85,9 +107,40 @@ class MCPServerRef(CapabilityRef):
|
|
|
85
107
|
args: list[str] = Field(default_factory=list)
|
|
86
108
|
endpoint_url: str | None = None
|
|
87
109
|
env_refs: dict[str, str] = Field(default_factory=dict)
|
|
110
|
+
# ``dsh-profile`` is resolved at PluginHost activation time. Only the
|
|
111
|
+
# immutable profile/inventory identity is allowed into an Agent Build;
|
|
112
|
+
# the loopback endpoint and bearer token remain process-scoped lease data.
|
|
113
|
+
materialization: Literal["dsh-profile"] | None = None
|
|
114
|
+
profile: str | None = None
|
|
115
|
+
profile_digest: str | None = None
|
|
116
|
+
descriptor_digest: str | None = None
|
|
117
|
+
inventory_digest: str | None = None
|
|
88
118
|
|
|
89
119
|
@model_validator(mode="after")
|
|
90
120
|
def validate_transport(self) -> "MCPServerRef":
|
|
121
|
+
dynamic_fields = (
|
|
122
|
+
self.profile,
|
|
123
|
+
self.profile_digest,
|
|
124
|
+
self.descriptor_digest,
|
|
125
|
+
self.inventory_digest,
|
|
126
|
+
)
|
|
127
|
+
if self.materialization == "dsh-profile":
|
|
128
|
+
if self.transport != "http":
|
|
129
|
+
raise ValueError("DSH Profile MCP 必须使用运行时 HTTP 租约")
|
|
130
|
+
if self.endpoint_url or self.command or self.args or self.env_refs:
|
|
131
|
+
raise ValueError("DSH Profile MCP 不能持久化 endpoint、命令或环境变量")
|
|
132
|
+
if not all(dynamic_fields):
|
|
133
|
+
raise ValueError("DSH Profile MCP 必须锁定 Profile 与能力摘要")
|
|
134
|
+
if not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._-]{0,63}", self.profile or ""):
|
|
135
|
+
raise ValueError("DSH Profile 名称无效")
|
|
136
|
+
if any(
|
|
137
|
+
not re.fullmatch(r"sha256:[0-9a-f]{64}", value or "")
|
|
138
|
+
for value in dynamic_fields[1:]
|
|
139
|
+
):
|
|
140
|
+
raise ValueError("DSH Profile MCP 摘要无效")
|
|
141
|
+
return self
|
|
142
|
+
if any(value is not None for value in dynamic_fields):
|
|
143
|
+
raise ValueError("静态 MCP 不能声明 DSH Profile 运行时字段")
|
|
91
144
|
if self.transport == "stdio" and not self.command:
|
|
92
145
|
raise ValueError("stdio MCP 必须配置 command")
|
|
93
146
|
if self.transport in {"http", "sse"} and not self.endpoint_url:
|
|
@@ -176,6 +229,53 @@ class CapabilityBinding(ContractModel):
|
|
|
176
229
|
config: dict[str, Any] = Field(default_factory=dict)
|
|
177
230
|
|
|
178
231
|
|
|
232
|
+
class NativePluginBinding(ContractModel):
|
|
233
|
+
"""Immutable component selection from a host-managed native plugin."""
|
|
234
|
+
|
|
235
|
+
ecosystem: Literal["codex", "dsh"]
|
|
236
|
+
plugin_ref: str = Field(min_length=12, max_length=256)
|
|
237
|
+
snapshot_digest: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")
|
|
238
|
+
components: list[str] = Field(min_length=1, max_length=128)
|
|
239
|
+
enabled: bool = True
|
|
240
|
+
config: dict[str, Any] = Field(default_factory=dict)
|
|
241
|
+
|
|
242
|
+
@field_validator("plugin_ref")
|
|
243
|
+
@classmethod
|
|
244
|
+
def validate_plugin_ref(cls, value: str) -> str:
|
|
245
|
+
if not re.fullmatch(
|
|
246
|
+
r"plugin://[a-z0-9]+(?:[._-][a-z0-9]+)*@"
|
|
247
|
+
r"\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?",
|
|
248
|
+
value,
|
|
249
|
+
):
|
|
250
|
+
raise ValueError("插件绑定必须使用 plugin://<id>@<exact-version>")
|
|
251
|
+
return value
|
|
252
|
+
|
|
253
|
+
@field_validator("components")
|
|
254
|
+
@classmethod
|
|
255
|
+
def validate_components(cls, value: list[str]) -> list[str]:
|
|
256
|
+
if len(value) != len(set(value)):
|
|
257
|
+
raise ValueError("插件组件不能重复")
|
|
258
|
+
if any(
|
|
259
|
+
not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}", component)
|
|
260
|
+
for component in value
|
|
261
|
+
):
|
|
262
|
+
raise ValueError("插件组件 ID 无效")
|
|
263
|
+
return value
|
|
264
|
+
|
|
265
|
+
@field_validator("config")
|
|
266
|
+
@classmethod
|
|
267
|
+
def validate_config(cls, value: dict[str, Any]) -> dict[str, Any]:
|
|
268
|
+
_reject_clear_runtime_secrets(value, path="pluginBinding.config")
|
|
269
|
+
return value
|
|
270
|
+
|
|
271
|
+
@model_validator(mode="after")
|
|
272
|
+
def validate_platform_resource_config(self) -> "NativePluginBinding":
|
|
273
|
+
from ksadk.resource_runtime.plugin_config import resource_plugin_config
|
|
274
|
+
|
|
275
|
+
resource_plugin_config(self.plugin_ref, self.ecosystem, self.config, enabled=self.enabled)
|
|
276
|
+
return self
|
|
277
|
+
|
|
278
|
+
|
|
179
279
|
class AgentBindings(ContractModel):
|
|
180
280
|
model_profile_id: str | None = None
|
|
181
281
|
model_profile_ids: list[str] = Field(default_factory=list)
|
|
@@ -184,6 +284,7 @@ class AgentBindings(ContractModel):
|
|
|
184
284
|
tools: list[CapabilityBinding] = Field(default_factory=list)
|
|
185
285
|
mcp_servers: list[CapabilityBinding] = Field(default_factory=list)
|
|
186
286
|
skills: list[CapabilityBinding] = Field(default_factory=list)
|
|
287
|
+
plugins: list[NativePluginBinding] = Field(default_factory=list)
|
|
187
288
|
|
|
188
289
|
@model_validator(mode="after")
|
|
189
290
|
def validate_model_profiles(self) -> "AgentBindings":
|
|
@@ -197,6 +298,12 @@ class AgentBindings(ContractModel):
|
|
|
197
298
|
and self.model_profile_id not in self.model_profile_ids
|
|
198
299
|
):
|
|
199
300
|
raise ValueError("默认 modelProfileId 必须包含在 modelProfileIds 中")
|
|
301
|
+
plugin_refs = [binding.plugin_ref for binding in self.plugins if binding.enabled]
|
|
302
|
+
if len(plugin_refs) != len(set(plugin_refs)):
|
|
303
|
+
raise ValueError("启用的插件绑定不能重复 pluginRef")
|
|
304
|
+
from ksadk.resource_runtime.plugin_config import validate_resource_plugin_bindings
|
|
305
|
+
|
|
306
|
+
validate_resource_plugin_bindings(self.plugins)
|
|
200
307
|
return self
|
|
201
308
|
|
|
202
309
|
|
|
@@ -292,6 +399,13 @@ class MemoryWriteSpec(ContractModel):
|
|
|
292
399
|
flush_before_compaction: bool = True
|
|
293
400
|
|
|
294
401
|
|
|
402
|
+
MemoryScope = Literal["tenant", "workspace", "agent", "user"]
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
def _default_memory_scopes() -> list[MemoryScope]:
|
|
406
|
+
return ["workspace", "agent", "user"]
|
|
407
|
+
|
|
408
|
+
|
|
295
409
|
class MemorySpec(ContractModel):
|
|
296
410
|
"""AgentVersion 级 Memory 策略(方案 §5.1 / §10)。Build 只存 providerRef,不存凭证。"""
|
|
297
411
|
|
|
@@ -299,9 +413,7 @@ class MemorySpec(ContractModel):
|
|
|
299
413
|
provider_ref: str = Field(default="local-default", max_length=128)
|
|
300
414
|
recall: MemoryRecallSpec = Field(default_factory=MemoryRecallSpec)
|
|
301
415
|
write: MemoryWriteSpec = Field(default_factory=MemoryWriteSpec)
|
|
302
|
-
scopes: list[
|
|
303
|
-
default_factory=lambda: ["workspace", "agent", "user"]
|
|
304
|
-
)
|
|
416
|
+
scopes: list[MemoryScope] = Field(default_factory=_default_memory_scopes)
|
|
305
417
|
|
|
306
418
|
|
|
307
419
|
class NetworkPolicy(ContractModel):
|
|
@@ -329,12 +441,17 @@ class RuntimeRef(ContractModel):
|
|
|
329
441
|
project entrypoint that is snapshotted by its Build.
|
|
330
442
|
"""
|
|
331
443
|
|
|
332
|
-
type: Literal["codex", "adk", "langgraph"]
|
|
444
|
+
type: Literal["codex", "adk", "langgraph", "harness", "plugin"]
|
|
333
445
|
project_path: str | None = Field(default=None, min_length=1, max_length=1024)
|
|
334
446
|
entry_point: str | None = Field(default=None, min_length=1, max_length=1024)
|
|
335
447
|
agent_variable: str = Field(default="root_agent", min_length=1, max_length=256)
|
|
336
448
|
version: str | None = Field(default=None, min_length=1, max_length=64)
|
|
337
449
|
detection: Literal["declared", "auto"] = "declared"
|
|
450
|
+
provider_ref: str | None = Field(default=None, min_length=12, max_length=256)
|
|
451
|
+
provider_config: dict[str, Any] = Field(
|
|
452
|
+
default_factory=dict,
|
|
453
|
+
exclude_if=lambda value: not value,
|
|
454
|
+
)
|
|
338
455
|
|
|
339
456
|
@field_validator("project_path", "entry_point")
|
|
340
457
|
@classmethod
|
|
@@ -352,8 +469,32 @@ class RuntimeRef(ContractModel):
|
|
|
352
469
|
raise ValueError("Runtime 路径必须是工作区内的相对路径")
|
|
353
470
|
return normalized
|
|
354
471
|
|
|
472
|
+
@field_validator("provider_ref")
|
|
473
|
+
@classmethod
|
|
474
|
+
def validate_provider_ref(cls, value: str | None) -> str | None:
|
|
475
|
+
if value is None:
|
|
476
|
+
return None
|
|
477
|
+
if not re.fullmatch(
|
|
478
|
+
r"plugin://[a-z0-9]+(?:[._-][a-z0-9]+)*@"
|
|
479
|
+
r"\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?",
|
|
480
|
+
value,
|
|
481
|
+
):
|
|
482
|
+
raise ValueError("Provider 引用必须固定为 plugin://<id>@<exact-version>")
|
|
483
|
+
return value
|
|
484
|
+
|
|
485
|
+
@field_validator("provider_config")
|
|
486
|
+
@classmethod
|
|
487
|
+
def validate_provider_config(cls, value: dict[str, Any]) -> dict[str, Any]:
|
|
488
|
+
_reject_clear_runtime_secrets(value)
|
|
489
|
+
return value
|
|
490
|
+
|
|
355
491
|
@model_validator(mode="after")
|
|
356
492
|
def validate_framework_source(self) -> "RuntimeRef":
|
|
493
|
+
if self.type == "plugin":
|
|
494
|
+
if not self.provider_ref:
|
|
495
|
+
raise ValueError("plugin Runtime 必须配置 providerRef")
|
|
496
|
+
elif self.provider_ref is not None or self.provider_config:
|
|
497
|
+
raise ValueError("只有 plugin Runtime 可以配置 providerRef/providerConfig")
|
|
357
498
|
if self.type in {"adk", "langgraph"}:
|
|
358
499
|
if not self.project_path:
|
|
359
500
|
raise ValueError(f"{self.type} Runtime 必须配置 projectPath")
|
|
@@ -362,10 +503,35 @@ class RuntimeRef(ContractModel):
|
|
|
362
503
|
return self
|
|
363
504
|
|
|
364
505
|
|
|
506
|
+
_RUNTIME_SECRET_KEY = re.compile(r"(?:secret|password|token|api[_-]?key)", re.IGNORECASE)
|
|
507
|
+
_RUNTIME_SECRET_REF_PREFIXES = (
|
|
508
|
+
"secret://",
|
|
509
|
+
"env://",
|
|
510
|
+
"credential://",
|
|
511
|
+
"vault://",
|
|
512
|
+
)
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
def _reject_clear_runtime_secrets(value: Any, *, path: str = "providerConfig") -> None:
|
|
516
|
+
"""Provider config is revision data: it may only retain secret references."""
|
|
517
|
+
|
|
518
|
+
if isinstance(value, dict):
|
|
519
|
+
for key, child in value.items():
|
|
520
|
+
child_path = f"{path}.{key}"
|
|
521
|
+
if _RUNTIME_SECRET_KEY.search(str(key)) and child is not None:
|
|
522
|
+
if not isinstance(child, str) or not child.startswith(_RUNTIME_SECRET_REF_PREFIXES):
|
|
523
|
+
raise ValueError(f"{child_path} 必须保存 Secret 引用,不能保存明文")
|
|
524
|
+
_reject_clear_runtime_secrets(child, path=child_path)
|
|
525
|
+
elif isinstance(value, list):
|
|
526
|
+
for index, child in enumerate(value):
|
|
527
|
+
_reject_clear_runtime_secrets(child, path=f"{path}[{index}]")
|
|
528
|
+
|
|
529
|
+
|
|
365
530
|
class AgentSpec(ContractModel):
|
|
366
531
|
description: str = Field(default="", max_length=1024)
|
|
367
532
|
runtime: RuntimeRef | None = None
|
|
368
533
|
instructions: Instructions = Field(default_factory=Instructions)
|
|
534
|
+
soul: SoulDocument | None = None
|
|
369
535
|
model: ModelSpec | None = None
|
|
370
536
|
capabilities: CapabilitiesSpec = Field(default_factory=CapabilitiesSpec)
|
|
371
537
|
bindings: AgentBindings = Field(default_factory=AgentBindings)
|
|
@@ -375,6 +541,27 @@ class AgentSpec(ContractModel):
|
|
|
375
541
|
security: SecuritySpec = Field(default_factory=SecuritySpec)
|
|
376
542
|
evaluation: EvaluationSpec = Field(default_factory=EvaluationSpec)
|
|
377
543
|
|
|
544
|
+
@model_validator(mode="after")
|
|
545
|
+
def validate_memory_resource_reference(self) -> "AgentSpec":
|
|
546
|
+
if not self.memory.enabled or not self.memory.provider_ref.startswith("binding://"):
|
|
547
|
+
return self
|
|
548
|
+
from ksadk.resource_runtime.plugin_config import resource_plugin_config
|
|
549
|
+
|
|
550
|
+
binding_id = self.memory.provider_ref.removeprefix("binding://")
|
|
551
|
+
for binding in self.bindings.plugins:
|
|
552
|
+
if not binding.enabled:
|
|
553
|
+
continue
|
|
554
|
+
resource = resource_plugin_config(
|
|
555
|
+
binding.plugin_ref, binding.ecosystem, binding.config, enabled=True
|
|
556
|
+
)
|
|
557
|
+
if resource is not None and resource.binding.id == binding_id:
|
|
558
|
+
if resource.binding.resource.kind != "memory-instance":
|
|
559
|
+
raise ValueError("Memory providerRef must reference a memory-instance binding")
|
|
560
|
+
if self.memory.scopes != ["user"]:
|
|
561
|
+
raise ValueError("Platform memory requires explicit scopes: [user]")
|
|
562
|
+
return self
|
|
563
|
+
raise ValueError("Memory providerRef references a missing or disabled resource binding")
|
|
564
|
+
|
|
378
565
|
|
|
379
566
|
_AGENT_ID_PATTERN = re.compile(r"^[a-z][a-z0-9-]{2,62}$")
|
|
380
567
|
_AGENT_AVATAR_URL_PATTERN = re.compile(r"^/api/v1/assets/agent-avatars/[0-9a-f]{64}\.(?:png|webp)$")
|
|
@@ -498,6 +685,7 @@ class ResolvedAgentSpec(ContractModel):
|
|
|
498
685
|
source_revision: int
|
|
499
686
|
compiler_version: str = "1"
|
|
500
687
|
instructions: Instructions
|
|
688
|
+
soul: SoulDocument | None = None
|
|
501
689
|
model: ResolvedModel
|
|
502
690
|
capabilities: ResolvedCapabilities
|
|
503
691
|
execution: ExecutionSpec
|
|
@@ -545,11 +733,56 @@ class BundleManifest(ContractModel):
|
|
|
545
733
|
source_digest: str = ""
|
|
546
734
|
runtime_contract: Literal["agentkit.runtime/v1"] = "agentkit.runtime/v1"
|
|
547
735
|
plugin_lock_digest: str = ""
|
|
736
|
+
# A v0.8.2 bundle already used the v2 envelope without a composition.
|
|
737
|
+
# Keep that wire shape readable as the explicit legacy execution profile;
|
|
738
|
+
# newly built bundles write ``composition_mode`` so consumers never need
|
|
739
|
+
# to infer whether PluginHost admission is required from missing files.
|
|
740
|
+
composition_mode: Literal["legacy", "composed"] | None = None
|
|
741
|
+
composition_profile_digest: str | None = None
|
|
548
742
|
hosted_kernel_requirement_digest: str = ""
|
|
743
|
+
resource_build_digest: str | None = Field(
|
|
744
|
+
default=None,
|
|
745
|
+
pattern=r"^sha256:[0-9a-f]{64}$",
|
|
746
|
+
)
|
|
747
|
+
resource_snapshot_digest: str | None = Field(
|
|
748
|
+
default=None,
|
|
749
|
+
pattern=r"^sha256:[0-9a-f]{64}$",
|
|
750
|
+
)
|
|
549
751
|
files: list[FileEntry]
|
|
550
752
|
created_at: str = "1970-01-01T00:00:00Z"
|
|
551
753
|
bundle_digest: str = ""
|
|
552
754
|
|
|
755
|
+
@model_validator(mode="after")
|
|
756
|
+
def validate_composition_mode(self) -> "BundleManifest":
|
|
757
|
+
if self.composition_mode == "composed" and not self.composition_profile_digest:
|
|
758
|
+
raise ValueError("composed Bundle v2 requires compositionProfileDigest")
|
|
759
|
+
if self.composition_mode == "legacy" and self.composition_profile_digest:
|
|
760
|
+
raise ValueError("legacy Bundle v2 cannot declare compositionProfileDigest")
|
|
761
|
+
if bool(self.resource_build_digest) != bool(self.resource_snapshot_digest):
|
|
762
|
+
raise ValueError(
|
|
763
|
+
"resourceBuildDigest and resourceSnapshotDigest must be declared together"
|
|
764
|
+
)
|
|
765
|
+
return self
|
|
766
|
+
|
|
767
|
+
@property
|
|
768
|
+
def execution_profile(self) -> Literal["legacy", "composed"]:
|
|
769
|
+
"""Normalize historical v2 manifests without rewriting their bytes.
|
|
770
|
+
|
|
771
|
+
``compositionMode`` was added after the v0.8.2 envelope. Its absence
|
|
772
|
+
remains a backward-compatible projection: an embedded composition
|
|
773
|
+
digest is composed; its absence selects the established runtime path.
|
|
774
|
+
"""
|
|
775
|
+
|
|
776
|
+
if self.composition_mode is not None:
|
|
777
|
+
return self.composition_mode
|
|
778
|
+
return "composed" if self.composition_profile_digest else "legacy"
|
|
779
|
+
|
|
780
|
+
|
|
781
|
+
# ``BundleManifest`` is the existing, installed source type. The explicit
|
|
782
|
+
# name documents that its ``agentkit.bundle/v2`` branch is the Phase 2
|
|
783
|
+
# AgentBundleManifest/v2 contract; it is an alias, not a parallel manifest.
|
|
784
|
+
AgentBundleManifest = BundleManifest
|
|
785
|
+
|
|
553
786
|
|
|
554
787
|
class BuildRecord(ContractModel):
|
|
555
788
|
id: str
|
|
@@ -561,6 +794,14 @@ class BuildRecord(ContractModel):
|
|
|
561
794
|
source_digest: str = ""
|
|
562
795
|
runtime_lock: dict[str, Any] = Field(default_factory=dict)
|
|
563
796
|
bundle_digest: str = ""
|
|
797
|
+
resource_build_digest: str | None = Field(
|
|
798
|
+
default=None,
|
|
799
|
+
pattern=r"^sha256:[0-9a-f]{64}$",
|
|
800
|
+
)
|
|
801
|
+
resource_snapshot_digest: str | None = Field(
|
|
802
|
+
default=None,
|
|
803
|
+
pattern=r"^sha256:[0-9a-f]{64}$",
|
|
804
|
+
)
|
|
564
805
|
artifact_path: str | None = None
|
|
565
806
|
diagnostics: list[Diagnostic] = Field(default_factory=list)
|
|
566
807
|
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
|
@@ -735,6 +976,10 @@ class DeploymentRequest(ContractModel):
|
|
|
735
976
|
|
|
736
977
|
|
|
737
978
|
class DeploymentRecord(ContractModel):
|
|
979
|
+
# Identity observed when the cloud Agent was created, never inferred from
|
|
980
|
+
# whichever credentials happen to be configured when history is read.
|
|
981
|
+
created_by_name: str | None = None
|
|
982
|
+
created_by_user_id: str | None = None
|
|
738
983
|
id: str
|
|
739
984
|
build_id: str
|
|
740
985
|
bundle_digest: str
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"""Same-origin transport for the official Core client under the Studio shell.
|
|
2
|
+
|
|
3
|
+
This forwards bytes to the one supervised Core. It implements no DSH services,
|
|
4
|
+
plugin protocol, settings store, or module loader.
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import asyncio
|
|
9
|
+
import hmac
|
|
10
|
+
from http.cookiejar import CookieJar
|
|
11
|
+
from urllib.request import HTTPCookieProcessor, ProxyHandler, build_opener
|
|
12
|
+
from urllib.parse import urlsplit
|
|
13
|
+
from urllib.error import URLError
|
|
14
|
+
|
|
15
|
+
import httpx
|
|
16
|
+
from fastapi import FastAPI, Request, WebSocket
|
|
17
|
+
from starlette.background import BackgroundTask
|
|
18
|
+
from starlette.responses import Response, StreamingResponse
|
|
19
|
+
|
|
20
|
+
from ksadk.studio.errors import StudioError
|
|
21
|
+
from ksadk.plugins.host import PluginHostError
|
|
22
|
+
|
|
23
|
+
_HOP_HEADERS = {"host", "connection", "transfer-encoding", "content-length"}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def register_dsh_application(app: FastAPI, studio, *, session_secret: str, security_enabled: bool):
|
|
27
|
+
def authorized(cookies):
|
|
28
|
+
token = cookies.get("agentkit_studio_session", "")
|
|
29
|
+
return not security_enabled or hmac.compare_digest(token, session_secret)
|
|
30
|
+
|
|
31
|
+
@app.api_route("/studio-core/", methods=["GET"])
|
|
32
|
+
async def application(request: Request):
|
|
33
|
+
if not authorized(request.cookies):
|
|
34
|
+
raise StudioError("LOCAL_SESSION_REQUIRED", "请从 Studio 启动链接进入", status_code=401)
|
|
35
|
+
try:
|
|
36
|
+
lease = await studio.dsh_capabilities.connector_lease()
|
|
37
|
+
except PluginHostError:
|
|
38
|
+
raise StudioError("DSH_CORE_UNAVAILABLE", "插件服务暂时不可用,请返回 Studio 重试", status_code=503) from None
|
|
39
|
+
def bootstrap():
|
|
40
|
+
# urllib does not log the process-token URL at INFO like httpx.
|
|
41
|
+
jar = CookieJar()
|
|
42
|
+
opener = build_opener(ProxyHandler({}), HTTPCookieProcessor(jar))
|
|
43
|
+
with opener.open(lease.browser_url(), timeout=30) as response:
|
|
44
|
+
return response.read(), tuple(jar)
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
body, cookies = await asyncio.to_thread(bootstrap)
|
|
48
|
+
except (URLError, OSError):
|
|
49
|
+
# The upstream bootstrap URL contains a process token. Do not
|
|
50
|
+
# allow urllib's URL-bearing exception into API responses/logs.
|
|
51
|
+
raise StudioError("DSH_CORE_UNAVAILABLE", "插件服务连接失败,请返回 Studio 重试", status_code=503) from None
|
|
52
|
+
body = body.replace(b'<base href="/">', b'<base href="/studio-core/">')
|
|
53
|
+
result = Response(body, media_type="text/html", headers={"Cache-Control": "no-store"})
|
|
54
|
+
for cookie in cookies:
|
|
55
|
+
result.set_cookie(cookie.name, cookie.value, path=cookie.path, httponly=True, samesite="strict")
|
|
56
|
+
return result
|
|
57
|
+
|
|
58
|
+
# Registered last: the Studio API/static routes retain ownership of their paths.
|
|
59
|
+
@app.api_route("/{core_path:path}", methods=["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"])
|
|
60
|
+
async def core_http(core_path: str, request: Request):
|
|
61
|
+
if not authorized(request.cookies):
|
|
62
|
+
raise StudioError("LOCAL_SESSION_REQUIRED", "缺少有效的 Studio 本地会话", status_code=401)
|
|
63
|
+
# Retired Studio chat URLs must not start Core or depend on its availability.
|
|
64
|
+
if core_path.rstrip("/") == "chat" or core_path.startswith(("api/v1/", "v1/")):
|
|
65
|
+
raise StudioError("NOT_FOUND", "接口不存在", status_code=404)
|
|
66
|
+
# Browser mutations must originate in this document; never treat a
|
|
67
|
+
# cross-port loopback origin as trusted just because it is local.
|
|
68
|
+
if request.method not in {"GET", "HEAD"} and request.headers.get("origin") != str(request.base_url).rstrip("/"):
|
|
69
|
+
raise StudioError("LOCAL_ORIGIN_FORBIDDEN", "插件请求来源无效", status_code=403)
|
|
70
|
+
lease = await studio.dsh_capabilities.application_lease()
|
|
71
|
+
origin = lease.endpoint.rsplit("/", 1)[0]
|
|
72
|
+
path = request.url.path.removeprefix("/studio-core")
|
|
73
|
+
if request.url.query:
|
|
74
|
+
path += "?" + request.url.query
|
|
75
|
+
client = httpx.AsyncClient(trust_env=False, timeout=None)
|
|
76
|
+
headers = {key: value for key, value in request.headers.items() if key.lower() not in _HOP_HEADERS}
|
|
77
|
+
# Core checks origin against its own listening socket.
|
|
78
|
+
if "origin" in headers:
|
|
79
|
+
headers["origin"] = origin
|
|
80
|
+
try:
|
|
81
|
+
upstream = await client.send(client.build_request(request.method, origin + path, headers=headers, content=request.stream()), stream=True)
|
|
82
|
+
except BaseException:
|
|
83
|
+
await client.aclose()
|
|
84
|
+
raise
|
|
85
|
+
|
|
86
|
+
async def close():
|
|
87
|
+
await upstream.aclose()
|
|
88
|
+
await client.aclose()
|
|
89
|
+
|
|
90
|
+
result = StreamingResponse(upstream.aiter_raw(), status_code=upstream.status_code, background=BackgroundTask(close))
|
|
91
|
+
result.raw_headers = [(key, value) for key, value in upstream.headers.raw if key.decode().lower() not in _HOP_HEADERS]
|
|
92
|
+
return result
|
|
93
|
+
|
|
94
|
+
@app.websocket("/{core_path:path}")
|
|
95
|
+
async def core_socket(websocket: WebSocket, core_path: str):
|
|
96
|
+
# The SDK supports websockets 12 through 15; the legacy client is
|
|
97
|
+
# available throughout this range (the asyncio client starts at 13).
|
|
98
|
+
from websockets.legacy.client import connect
|
|
99
|
+
|
|
100
|
+
origin = websocket.headers.get("origin")
|
|
101
|
+
expected = f"http://{websocket.headers.get('host')}"
|
|
102
|
+
if not authorized(websocket.cookies) or origin != expected:
|
|
103
|
+
await websocket.close(code=1008)
|
|
104
|
+
return
|
|
105
|
+
lease = await studio.dsh_capabilities.application_lease()
|
|
106
|
+
endpoint = urlsplit(lease.endpoint)
|
|
107
|
+
path = websocket.url.path.removeprefix("/studio-core") + ("?" + websocket.url.query if websocket.url.query else "")
|
|
108
|
+
protocols = websocket.scope.get("subprotocols", [])
|
|
109
|
+
async with connect(
|
|
110
|
+
f"ws://127.0.0.1:{endpoint.port}{path}",
|
|
111
|
+
origin=f"http://127.0.0.1:{endpoint.port}",
|
|
112
|
+
extra_headers={"Cookie": websocket.headers.get("cookie", "")},
|
|
113
|
+
subprotocols=protocols or None, max_size=16 * 1024 * 1024,
|
|
114
|
+
) as upstream:
|
|
115
|
+
await websocket.accept(subprotocol=upstream.subprotocol)
|
|
116
|
+
|
|
117
|
+
async def to_core():
|
|
118
|
+
while True:
|
|
119
|
+
message = await websocket.receive()
|
|
120
|
+
if message["type"] == "websocket.disconnect":
|
|
121
|
+
return
|
|
122
|
+
await upstream.send(message.get("text") if message.get("text") is not None else message["bytes"])
|
|
123
|
+
|
|
124
|
+
async def to_browser():
|
|
125
|
+
async for message in upstream:
|
|
126
|
+
if isinstance(message, str):
|
|
127
|
+
await websocket.send_text(message)
|
|
128
|
+
else:
|
|
129
|
+
await websocket.send_bytes(message)
|
|
130
|
+
|
|
131
|
+
tasks = [asyncio.create_task(to_core()), asyncio.create_task(to_browser())]
|
|
132
|
+
try:
|
|
133
|
+
await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
|
|
134
|
+
finally:
|
|
135
|
+
for task in tasks:
|
|
136
|
+
task.cancel()
|
|
137
|
+
await asyncio.gather(*tasks, return_exceptions=True)
|