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,569 @@
|
|
|
1
|
+
"""Frozen source contracts and internal records for plugin composition.
|
|
2
|
+
|
|
3
|
+
Only the models exported through ``__all__`` are public Phase 2 contracts.
|
|
4
|
+
``PluginManifest`` and its supporting models are internal admission records:
|
|
5
|
+
they project DSH/Codex host inventory into the Python composition engine and
|
|
6
|
+
are not a third installable package format or a stable public contract.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import hashlib
|
|
12
|
+
import json
|
|
13
|
+
import re
|
|
14
|
+
from collections.abc import Mapping
|
|
15
|
+
from pathlib import PurePosixPath
|
|
16
|
+
from typing import Any, Literal
|
|
17
|
+
from urllib.parse import urlsplit
|
|
18
|
+
|
|
19
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _to_camel(value: str) -> str:
|
|
23
|
+
head, *tail = value.split("_")
|
|
24
|
+
return head + "".join(part.capitalize() for part in tail)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class PluginContractModel(BaseModel):
|
|
28
|
+
model_config = ConfigDict(
|
|
29
|
+
alias_generator=_to_camel,
|
|
30
|
+
populate_by_name=True,
|
|
31
|
+
extra="forbid",
|
|
32
|
+
frozen=True,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
_SEMVER = re.compile(r"^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$")
|
|
37
|
+
_PLUGIN_ID = re.compile(r"^[a-z0-9]+(?:[._-][a-z0-9]+)*$")
|
|
38
|
+
_DIGEST = re.compile(r"^sha256:[0-9a-f]{64}$")
|
|
39
|
+
_DEFINITION = re.compile(r"^[a-z][a-z0-9._-]*/v[1-9][0-9]*$")
|
|
40
|
+
_SENSITIVE_KEY = re.compile(r"(?:secret|password|token|api[_-]?key)", re.IGNORECASE)
|
|
41
|
+
_SECRET_REF_PREFIXES = ("secret://", "env://", "credential://", "vault://")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _validate_semver(value: str, *, field: str) -> str:
|
|
45
|
+
if not _SEMVER.fullmatch(value):
|
|
46
|
+
raise ValueError(f"{field} must use an exact semantic version")
|
|
47
|
+
return value
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _validate_digest(value: str) -> str:
|
|
51
|
+
if not _DIGEST.fullmatch(value):
|
|
52
|
+
raise ValueError("digest must be a lowercase sha256: digest")
|
|
53
|
+
return value
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _validate_secret_references(value: Any, *, path: str = "config") -> None:
|
|
57
|
+
"""Configuration may carry references but never clear secret material."""
|
|
58
|
+
|
|
59
|
+
if isinstance(value, Mapping):
|
|
60
|
+
for key, child in value.items():
|
|
61
|
+
key_text = str(key)
|
|
62
|
+
child_path = f"{path}.{key_text}"
|
|
63
|
+
if _SENSITIVE_KEY.search(key_text) and child is not None:
|
|
64
|
+
if not isinstance(child, str) or not child.startswith(_SECRET_REF_PREFIXES):
|
|
65
|
+
raise ValueError(f"{child_path} must contain a secret reference, not a value")
|
|
66
|
+
_validate_secret_references(child, path=child_path)
|
|
67
|
+
elif isinstance(value, list):
|
|
68
|
+
for index, child in enumerate(value):
|
|
69
|
+
_validate_secret_references(child, path=f"{path}[{index}]")
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class PluginMetadata(PluginContractModel):
|
|
73
|
+
id: str = Field(min_length=3, max_length=128)
|
|
74
|
+
version: str
|
|
75
|
+
|
|
76
|
+
@field_validator("id")
|
|
77
|
+
@classmethod
|
|
78
|
+
def validate_plugin_id(cls, value: str) -> str:
|
|
79
|
+
if not _PLUGIN_ID.fullmatch(value):
|
|
80
|
+
raise ValueError("plugin id must be lowercase dot/dash/underscore qualified")
|
|
81
|
+
return value
|
|
82
|
+
|
|
83
|
+
@field_validator("version")
|
|
84
|
+
@classmethod
|
|
85
|
+
def validate_version(cls, value: str) -> str:
|
|
86
|
+
return _validate_semver(value, field="plugin version")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class CapabilityOffer(PluginContractModel):
|
|
90
|
+
definition: str
|
|
91
|
+
slot: str = Field(min_length=3, max_length=128)
|
|
92
|
+
mode: Literal["unique", "multiple"]
|
|
93
|
+
|
|
94
|
+
@field_validator("definition")
|
|
95
|
+
@classmethod
|
|
96
|
+
def validate_definition(cls, value: str) -> str:
|
|
97
|
+
if not _DEFINITION.fullmatch(value):
|
|
98
|
+
raise ValueError(
|
|
99
|
+
"definition must be a versioned capability name such as agent.provider/v1"
|
|
100
|
+
)
|
|
101
|
+
return value
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class PluginSourceSnapshot(PluginContractModel):
|
|
105
|
+
"""Credential-free upstream identity retained in an immutable plugin lock.
|
|
106
|
+
|
|
107
|
+
Lifecycle hosts (Codex App Server or DSH) remain responsible for resolving
|
|
108
|
+
and installing packages. This record only captures the exact source that
|
|
109
|
+
was admitted so a later build cannot silently follow a mutable marketplace,
|
|
110
|
+
Git branch, npm tag, or local directory.
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
ecosystem: Literal["ksadk", "codex", "dsh"]
|
|
114
|
+
type: Literal["builtin", "registry", "local", "git", "npm", "market", "runtime-native"]
|
|
115
|
+
requested: str = Field(min_length=1, max_length=2048)
|
|
116
|
+
resolved: str = Field(min_length=1, max_length=2048)
|
|
117
|
+
integrity: str | None = Field(default=None, max_length=512)
|
|
118
|
+
marketplace: str | None = Field(default=None, max_length=256)
|
|
119
|
+
registry: str | None = Field(default=None, max_length=2048)
|
|
120
|
+
|
|
121
|
+
@field_validator("requested", "resolved", "integrity", "marketplace", "registry")
|
|
122
|
+
@classmethod
|
|
123
|
+
def validate_public_coordinate(cls, value: str | None) -> str | None:
|
|
124
|
+
if value is None:
|
|
125
|
+
return None
|
|
126
|
+
if value != value.strip() or any(ord(character) < 32 for character in value):
|
|
127
|
+
raise ValueError("plugin source coordinates must be trimmed printable text")
|
|
128
|
+
# Build artifacts and inventories are routinely shared. A source URL
|
|
129
|
+
# therefore cannot retain embedded credentials, query tokens, or URL
|
|
130
|
+
# fragments. Authentication remains a host-owned credential concern.
|
|
131
|
+
if "://" in value:
|
|
132
|
+
parsed = urlsplit(value)
|
|
133
|
+
if parsed.username or parsed.password or parsed.query or parsed.fragment:
|
|
134
|
+
raise ValueError("plugin source coordinates must not contain credentials")
|
|
135
|
+
return value
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class LockedPluginComponent(PluginContractModel):
|
|
139
|
+
"""One selected native component and the bytes admitted for a build."""
|
|
140
|
+
|
|
141
|
+
id: str = Field(min_length=1, max_length=256)
|
|
142
|
+
kind: Literal["skill", "mcp", "hook", "app", "client"]
|
|
143
|
+
digest: str
|
|
144
|
+
path: str | None = Field(default=None, max_length=512)
|
|
145
|
+
|
|
146
|
+
@field_validator("id")
|
|
147
|
+
@classmethod
|
|
148
|
+
def validate_component_id(cls, value: str) -> str:
|
|
149
|
+
if not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._:/-]*", value):
|
|
150
|
+
raise ValueError("plugin component id is invalid")
|
|
151
|
+
return value
|
|
152
|
+
|
|
153
|
+
@field_validator("digest")
|
|
154
|
+
@classmethod
|
|
155
|
+
def validate_component_digest(cls, value: str) -> str:
|
|
156
|
+
return _validate_digest(value)
|
|
157
|
+
|
|
158
|
+
@field_validator("path")
|
|
159
|
+
@classmethod
|
|
160
|
+
def validate_component_path(cls, value: str | None) -> str | None:
|
|
161
|
+
if value is None:
|
|
162
|
+
return None
|
|
163
|
+
if "\\" in value:
|
|
164
|
+
raise ValueError("plugin component paths must use POSIX separators")
|
|
165
|
+
path = PurePosixPath(value)
|
|
166
|
+
if (
|
|
167
|
+
path.is_absolute()
|
|
168
|
+
or not path.parts
|
|
169
|
+
or any(part in {"", ".", ".."} for part in path.parts)
|
|
170
|
+
):
|
|
171
|
+
raise ValueError("plugin component path must stay relative to the plugin root")
|
|
172
|
+
return value
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class CapabilityRequirement(PluginContractModel):
|
|
176
|
+
definition: str
|
|
177
|
+
version: str = Field(min_length=1, max_length=128)
|
|
178
|
+
|
|
179
|
+
@field_validator("definition")
|
|
180
|
+
@classmethod
|
|
181
|
+
def validate_definition(cls, value: str) -> str:
|
|
182
|
+
if not _DEFINITION.fullmatch(value):
|
|
183
|
+
raise ValueError("definition must be a versioned capability name")
|
|
184
|
+
return value
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class PluginCompatibility(PluginContractModel):
|
|
188
|
+
kernel_api: str = Field(min_length=1, max_length=128)
|
|
189
|
+
runtime_protocols: list[str] = Field(default_factory=list)
|
|
190
|
+
python: str | None = Field(default=None, max_length=128)
|
|
191
|
+
platforms: list[str] = Field(default_factory=list)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
class PluginProvenance(PluginContractModel):
|
|
195
|
+
source: Literal["builtin", "registry", "local", "market", "runtime-native"]
|
|
196
|
+
digest: str
|
|
197
|
+
signature_ref: str | None = Field(default=None, max_length=512)
|
|
198
|
+
license: str | None = Field(default=None, max_length=128)
|
|
199
|
+
upstream: PluginSourceSnapshot | None = None
|
|
200
|
+
components: tuple[LockedPluginComponent, ...] | None = None
|
|
201
|
+
|
|
202
|
+
@field_validator("digest")
|
|
203
|
+
@classmethod
|
|
204
|
+
def validate_digest(cls, value: str) -> str:
|
|
205
|
+
return _validate_digest(value)
|
|
206
|
+
|
|
207
|
+
@field_validator("components")
|
|
208
|
+
@classmethod
|
|
209
|
+
def validate_components(
|
|
210
|
+
cls, value: tuple[LockedPluginComponent, ...] | None
|
|
211
|
+
) -> tuple[LockedPluginComponent, ...] | None:
|
|
212
|
+
if value is None:
|
|
213
|
+
return None
|
|
214
|
+
identities = [(item.kind, item.id) for item in value]
|
|
215
|
+
if len(identities) != len(set(identities)):
|
|
216
|
+
raise ValueError("plugin components must have unique kind/id identities")
|
|
217
|
+
return tuple(sorted(value, key=lambda item: (item.kind, item.id, item.digest)))
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
class PluginSpec(PluginContractModel):
|
|
221
|
+
domain: Literal["ksadk-platform", "runtime-native"]
|
|
222
|
+
runtime: Literal["python", "node", "process", "remote", "native"]
|
|
223
|
+
entrypoint: str | None = Field(default=None, max_length=512)
|
|
224
|
+
provides: list[CapabilityOffer] = Field(min_length=1)
|
|
225
|
+
requires: list[CapabilityRequirement] = Field(default_factory=list)
|
|
226
|
+
optional: list[CapabilityRequirement] = Field(default_factory=list)
|
|
227
|
+
config_schema: str | None = Field(default=None, max_length=512)
|
|
228
|
+
secret_fields: list[str] = Field(default_factory=list)
|
|
229
|
+
permissions: list[str] = Field(default_factory=list)
|
|
230
|
+
isolation: Literal["in-process", "process", "sidecar", "remote", "native"]
|
|
231
|
+
compatibility: PluginCompatibility
|
|
232
|
+
health_contract: str = Field(min_length=1, max_length=128)
|
|
233
|
+
provenance: PluginProvenance
|
|
234
|
+
|
|
235
|
+
@model_validator(mode="after")
|
|
236
|
+
def validate_shape(self) -> "PluginSpec":
|
|
237
|
+
if self.runtime == "native" and self.domain != "runtime-native":
|
|
238
|
+
raise ValueError("native runtime plugins must use runtime-native domain")
|
|
239
|
+
if self.runtime != "native" and not self.entrypoint:
|
|
240
|
+
raise ValueError("non-native plugins require an entrypoint")
|
|
241
|
+
offers = [(item.definition, item.slot) for item in self.provides]
|
|
242
|
+
if len(offers) != len(set(offers)):
|
|
243
|
+
raise ValueError("plugin provides duplicate capability/slot offers")
|
|
244
|
+
if len(self.secret_fields) != len(set(self.secret_fields)):
|
|
245
|
+
raise ValueError("plugin secretFields must be unique")
|
|
246
|
+
if len(self.permissions) != len(set(self.permissions)):
|
|
247
|
+
raise ValueError("plugin permissions must be unique")
|
|
248
|
+
return self
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class PluginManifest(PluginContractModel):
|
|
252
|
+
"""Internal host projection; never a developer-authored plugin package."""
|
|
253
|
+
|
|
254
|
+
api_version: Literal["plugin.ksadk.io/v1"] = "plugin.ksadk.io/v1"
|
|
255
|
+
kind: Literal["Plugin"] = "Plugin"
|
|
256
|
+
metadata: PluginMetadata
|
|
257
|
+
spec: PluginSpec
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
class CapabilityDefinitionSpec(PluginContractModel):
|
|
261
|
+
definition: str
|
|
262
|
+
slot: str = Field(min_length=3, max_length=128)
|
|
263
|
+
multiplicity: Literal["unique", "multiple"]
|
|
264
|
+
owner_required: bool = True
|
|
265
|
+
config_schema: str | None = Field(default=None, max_length=512)
|
|
266
|
+
|
|
267
|
+
@field_validator("definition")
|
|
268
|
+
@classmethod
|
|
269
|
+
def validate_definition(cls, value: str) -> str:
|
|
270
|
+
if not _DEFINITION.fullmatch(value):
|
|
271
|
+
raise ValueError("definition must be a versioned capability name")
|
|
272
|
+
return value
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
class CapabilityDefinition(PluginContractModel):
|
|
276
|
+
api_version: Literal["capability.ksadk.io/v1"] = "capability.ksadk.io/v1"
|
|
277
|
+
kind: Literal["CapabilityDefinition"] = "CapabilityDefinition"
|
|
278
|
+
metadata: PluginMetadata
|
|
279
|
+
spec: CapabilityDefinitionSpec
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
class PluginReference(PluginContractModel):
|
|
283
|
+
ref: str = Field(min_length=12, max_length=256)
|
|
284
|
+
config: dict[str, Any] = Field(default_factory=dict)
|
|
285
|
+
|
|
286
|
+
@field_validator("ref")
|
|
287
|
+
@classmethod
|
|
288
|
+
def validate_reference(cls, value: str) -> str:
|
|
289
|
+
if not value.startswith("plugin://") or "@" not in value:
|
|
290
|
+
raise ValueError("plugin reference must be plugin://<id>@<exact-version>")
|
|
291
|
+
plugin_id, version = value.removeprefix("plugin://").rsplit("@", 1)
|
|
292
|
+
if not _PLUGIN_ID.fullmatch(plugin_id):
|
|
293
|
+
raise ValueError("plugin reference id is invalid")
|
|
294
|
+
_validate_semver(version, field="plugin reference version")
|
|
295
|
+
return value
|
|
296
|
+
|
|
297
|
+
@field_validator("config")
|
|
298
|
+
@classmethod
|
|
299
|
+
def validate_config(cls, value: dict[str, Any]) -> dict[str, Any]:
|
|
300
|
+
_validate_secret_references(value)
|
|
301
|
+
return value
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
class CompositionCapability(PluginContractModel):
|
|
305
|
+
ref: str = Field(min_length=8, max_length=512)
|
|
306
|
+
required: bool = True
|
|
307
|
+
config: dict[str, Any] = Field(default_factory=dict)
|
|
308
|
+
|
|
309
|
+
@field_validator("ref")
|
|
310
|
+
@classmethod
|
|
311
|
+
def validate_reference(cls, value: str) -> str:
|
|
312
|
+
if not value.startswith(("plugin://", "mcp://", "skill://")) or "@" not in value:
|
|
313
|
+
raise ValueError(
|
|
314
|
+
"capability ref must be a pinned plugin://, mcp://, or skill:// reference"
|
|
315
|
+
)
|
|
316
|
+
return value
|
|
317
|
+
|
|
318
|
+
@field_validator("config")
|
|
319
|
+
@classmethod
|
|
320
|
+
def validate_config(cls, value: dict[str, Any]) -> dict[str, Any]:
|
|
321
|
+
_validate_secret_references(value)
|
|
322
|
+
return value
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
class NativeExtension(PluginContractModel):
|
|
326
|
+
runtime: str = Field(min_length=1, max_length=64)
|
|
327
|
+
ref: str = Field(min_length=8, max_length=512)
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
class CompositionProfile(PluginContractModel):
|
|
331
|
+
api_version: Literal["composition.ksadk.io/v1"] = "composition.ksadk.io/v1"
|
|
332
|
+
agent_provider: PluginReference
|
|
333
|
+
capabilities: list[CompositionCapability] = Field(default_factory=list)
|
|
334
|
+
native_extensions: list[NativeExtension] = Field(default_factory=list)
|
|
335
|
+
policies: dict[str, str] = Field(default_factory=dict)
|
|
336
|
+
ui_contributions: list[str] = Field(default_factory=list)
|
|
337
|
+
|
|
338
|
+
@model_validator(mode="after")
|
|
339
|
+
def validate_profile(self) -> "CompositionProfile":
|
|
340
|
+
refs = [item.ref for item in self.capabilities]
|
|
341
|
+
if len(refs) != len(set(refs)):
|
|
342
|
+
raise ValueError("composition capabilities must not repeat a reference")
|
|
343
|
+
extensions = [(item.runtime, item.ref) for item in self.native_extensions]
|
|
344
|
+
if len(extensions) != len(set(extensions)):
|
|
345
|
+
raise ValueError("native extensions must not repeat a runtime/reference pair")
|
|
346
|
+
return self
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
class LockedCapability(PluginContractModel):
|
|
350
|
+
definition: str
|
|
351
|
+
slot: str = Field(min_length=3, max_length=128)
|
|
352
|
+
owner: str = Field(min_length=3, max_length=128)
|
|
353
|
+
|
|
354
|
+
@field_validator("definition")
|
|
355
|
+
@classmethod
|
|
356
|
+
def validate_definition(cls, value: str) -> str:
|
|
357
|
+
if not _DEFINITION.fullmatch(value):
|
|
358
|
+
raise ValueError("definition must be a versioned capability name")
|
|
359
|
+
return value
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
class PluginDependency(PluginContractModel):
|
|
363
|
+
id: str = Field(min_length=3, max_length=128)
|
|
364
|
+
version: str
|
|
365
|
+
digest: str
|
|
366
|
+
|
|
367
|
+
@field_validator("id")
|
|
368
|
+
@classmethod
|
|
369
|
+
def validate_id(cls, value: str) -> str:
|
|
370
|
+
if not _PLUGIN_ID.fullmatch(value):
|
|
371
|
+
raise ValueError("dependency id is invalid")
|
|
372
|
+
return value
|
|
373
|
+
|
|
374
|
+
@field_validator("version")
|
|
375
|
+
@classmethod
|
|
376
|
+
def validate_version(cls, value: str) -> str:
|
|
377
|
+
return _validate_semver(value, field="dependency version")
|
|
378
|
+
|
|
379
|
+
@field_validator("digest")
|
|
380
|
+
@classmethod
|
|
381
|
+
def validate_digest(cls, value: str) -> str:
|
|
382
|
+
return _validate_digest(value)
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
class PluginLockEntry(PluginContractModel):
|
|
386
|
+
id: str = Field(min_length=3, max_length=128)
|
|
387
|
+
version: str
|
|
388
|
+
digest: str
|
|
389
|
+
source: Literal["builtin", "registry", "local", "market", "runtime-native"]
|
|
390
|
+
signature_ref: str | None = Field(default=None, max_length=512)
|
|
391
|
+
license: str | None = Field(default=None, max_length=128)
|
|
392
|
+
provides: list[LockedCapability] = Field(default_factory=list)
|
|
393
|
+
dependencies: list[PluginDependency] = Field(default_factory=list)
|
|
394
|
+
upstream: PluginSourceSnapshot | None = None
|
|
395
|
+
components: tuple[LockedPluginComponent, ...] | None = None
|
|
396
|
+
|
|
397
|
+
@field_validator("id")
|
|
398
|
+
@classmethod
|
|
399
|
+
def validate_id(cls, value: str) -> str:
|
|
400
|
+
if not _PLUGIN_ID.fullmatch(value):
|
|
401
|
+
raise ValueError("plugin lock id is invalid")
|
|
402
|
+
return value
|
|
403
|
+
|
|
404
|
+
@field_validator("version")
|
|
405
|
+
@classmethod
|
|
406
|
+
def validate_version(cls, value: str) -> str:
|
|
407
|
+
return _validate_semver(value, field="plugin lock version")
|
|
408
|
+
|
|
409
|
+
@field_validator("digest")
|
|
410
|
+
@classmethod
|
|
411
|
+
def validate_digest(cls, value: str) -> str:
|
|
412
|
+
return _validate_digest(value)
|
|
413
|
+
|
|
414
|
+
@field_validator("components")
|
|
415
|
+
@classmethod
|
|
416
|
+
def validate_components(
|
|
417
|
+
cls, value: tuple[LockedPluginComponent, ...] | None
|
|
418
|
+
) -> tuple[LockedPluginComponent, ...] | None:
|
|
419
|
+
if value is None:
|
|
420
|
+
return None
|
|
421
|
+
identities = [(item.kind, item.id) for item in value]
|
|
422
|
+
if len(identities) != len(set(identities)):
|
|
423
|
+
raise ValueError("plugin lock components must have unique kind/id identities")
|
|
424
|
+
return tuple(sorted(value, key=lambda item: (item.kind, item.id, item.digest)))
|
|
425
|
+
|
|
426
|
+
@model_validator(mode="after")
|
|
427
|
+
def validate_external_snapshot(self) -> "PluginLockEntry":
|
|
428
|
+
if self.upstream is not None:
|
|
429
|
+
compatible_sources = {
|
|
430
|
+
"builtin": {"builtin"},
|
|
431
|
+
"registry": {"registry", "npm"},
|
|
432
|
+
"local": {"local", "git", "npm"},
|
|
433
|
+
"market": {"market", "local", "git", "npm"},
|
|
434
|
+
"runtime-native": {"runtime-native"},
|
|
435
|
+
}
|
|
436
|
+
if self.upstream.type not in compatible_sources[self.source]:
|
|
437
|
+
raise ValueError("plugin lock source and upstream source type are inconsistent")
|
|
438
|
+
return self
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
class PluginLock(PluginContractModel):
|
|
442
|
+
"""The current Bundle v2 lock shape, now with an exact typed entry form."""
|
|
443
|
+
|
|
444
|
+
lock_format: Literal["agentkit.plugin-lock/v1"] = "agentkit.plugin-lock/v1"
|
|
445
|
+
plugins: list[PluginLockEntry] = Field(default_factory=list)
|
|
446
|
+
|
|
447
|
+
@field_validator("plugins")
|
|
448
|
+
@classmethod
|
|
449
|
+
def sort_plugins(cls, value: list[PluginLockEntry]) -> list[PluginLockEntry]:
|
|
450
|
+
return sorted(value, key=lambda item: (item.id, item.version, item.digest))
|
|
451
|
+
|
|
452
|
+
@model_validator(mode="after")
|
|
453
|
+
def validate_graph(self) -> "PluginLock":
|
|
454
|
+
by_id = {item.id: item for item in self.plugins}
|
|
455
|
+
if len(by_id) != len(self.plugins):
|
|
456
|
+
raise ValueError("plugin lock must pin exactly one version for each plugin id")
|
|
457
|
+
for item in self.plugins:
|
|
458
|
+
for dependency in item.dependencies:
|
|
459
|
+
target = by_id.get(dependency.id)
|
|
460
|
+
if target is None:
|
|
461
|
+
raise ValueError(f"plugin dependency {dependency.id!r} is not pinned")
|
|
462
|
+
if (target.version, target.digest) != (dependency.version, dependency.digest):
|
|
463
|
+
raise ValueError(
|
|
464
|
+
f"plugin dependency {dependency.id!r} does not match its lock entry"
|
|
465
|
+
)
|
|
466
|
+
if dependency.id == item.id:
|
|
467
|
+
raise ValueError("plugin lock cannot depend on itself")
|
|
468
|
+
visiting: set[str] = set()
|
|
469
|
+
visited: set[str] = set()
|
|
470
|
+
|
|
471
|
+
def visit(plugin_id: str) -> None:
|
|
472
|
+
if plugin_id in visiting:
|
|
473
|
+
raise ValueError("plugin lock dependency cycle")
|
|
474
|
+
if plugin_id in visited:
|
|
475
|
+
return
|
|
476
|
+
visiting.add(plugin_id)
|
|
477
|
+
for dependency in by_id[plugin_id].dependencies:
|
|
478
|
+
visit(dependency.id)
|
|
479
|
+
visiting.remove(plugin_id)
|
|
480
|
+
visited.add(plugin_id)
|
|
481
|
+
|
|
482
|
+
for plugin_id in by_id:
|
|
483
|
+
visit(plugin_id)
|
|
484
|
+
return self
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
class PluginInventoryItem(PluginContractModel):
|
|
488
|
+
id: str = Field(min_length=3, max_length=128)
|
|
489
|
+
version: str
|
|
490
|
+
digest: str
|
|
491
|
+
state: Literal[
|
|
492
|
+
"resolved",
|
|
493
|
+
"admitted",
|
|
494
|
+
"staged",
|
|
495
|
+
"starting",
|
|
496
|
+
"ready",
|
|
497
|
+
"degraded",
|
|
498
|
+
"failed",
|
|
499
|
+
"draining",
|
|
500
|
+
"stopped",
|
|
501
|
+
"disposed",
|
|
502
|
+
"rejected",
|
|
503
|
+
]
|
|
504
|
+
health: Literal["unknown", "healthy", "unhealthy"] = "unknown"
|
|
505
|
+
reason: str | None = Field(default=None, max_length=1024)
|
|
506
|
+
|
|
507
|
+
@field_validator("id")
|
|
508
|
+
@classmethod
|
|
509
|
+
def validate_id(cls, value: str) -> str:
|
|
510
|
+
if not _PLUGIN_ID.fullmatch(value):
|
|
511
|
+
raise ValueError("plugin inventory id is invalid")
|
|
512
|
+
return value
|
|
513
|
+
|
|
514
|
+
@field_validator("version")
|
|
515
|
+
@classmethod
|
|
516
|
+
def validate_version(cls, value: str) -> str:
|
|
517
|
+
return _validate_semver(value, field="plugin inventory version")
|
|
518
|
+
|
|
519
|
+
@field_validator("digest")
|
|
520
|
+
@classmethod
|
|
521
|
+
def validate_digest(cls, value: str) -> str:
|
|
522
|
+
return _validate_digest(value)
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
class PluginInventory(PluginContractModel):
|
|
526
|
+
api_version: Literal["plugin.ksadk.io/v1"] = "plugin.ksadk.io/v1"
|
|
527
|
+
kind: Literal["PluginInventory"] = "PluginInventory"
|
|
528
|
+
profile_digest: str = Field(min_length=8, max_length=80)
|
|
529
|
+
plugin_lock_digest: str = Field(min_length=8, max_length=80)
|
|
530
|
+
plugins: list[PluginInventoryItem] = Field(default_factory=list)
|
|
531
|
+
|
|
532
|
+
@field_validator("profile_digest", "plugin_lock_digest")
|
|
533
|
+
@classmethod
|
|
534
|
+
def validate_optional_digest(cls, value: str) -> str:
|
|
535
|
+
return _validate_digest(value)
|
|
536
|
+
|
|
537
|
+
@field_validator("plugins")
|
|
538
|
+
@classmethod
|
|
539
|
+
def sort_plugins(cls, value: list[PluginInventoryItem]) -> list[PluginInventoryItem]:
|
|
540
|
+
return sorted(value, key=lambda item: item.id)
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
def canonical_plugin_lock(lock: PluginLock) -> bytes:
|
|
544
|
+
"""Canonical JSON bytes used by Bundle v2 and admission fingerprinting."""
|
|
545
|
+
|
|
546
|
+
return json.dumps(
|
|
547
|
+
lock.model_dump(by_alias=True, exclude_none=True, mode="json"),
|
|
548
|
+
ensure_ascii=False,
|
|
549
|
+
sort_keys=True,
|
|
550
|
+
separators=(",", ":"),
|
|
551
|
+
).encode("utf-8")
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
def plugin_lock_digest(lock: PluginLock) -> str:
|
|
555
|
+
return f"sha256:{hashlib.sha256(canonical_plugin_lock(lock)).hexdigest()}"
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
__all__ = [
|
|
559
|
+
"CapabilityDefinition",
|
|
560
|
+
"CompositionProfile",
|
|
561
|
+
"LockedPluginComponent",
|
|
562
|
+
"PluginLock",
|
|
563
|
+
"PluginLockEntry",
|
|
564
|
+
"PluginInventory",
|
|
565
|
+
"PluginInventoryItem",
|
|
566
|
+
"PluginSourceSnapshot",
|
|
567
|
+
"canonical_plugin_lock",
|
|
568
|
+
"plugin_lock_digest",
|
|
569
|
+
]
|