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,165 @@
|
|
|
1
|
+
"""Resource binding and pinned Skill files retained as one verifiable build input.
|
|
2
|
+
|
|
3
|
+
The caller owns the enclosing Build and authorizes its resolved resource snapshot.
|
|
4
|
+
This module writes into its staging directory; it creates no alternate registry,
|
|
5
|
+
authorization store, or cloud upload path.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import json
|
|
12
|
+
import tempfile
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Literal, Mapping
|
|
15
|
+
|
|
16
|
+
from pydantic import field_validator, model_validator
|
|
17
|
+
|
|
18
|
+
from ksadk.plugins.contracts import PluginContractModel
|
|
19
|
+
from ksadk.resource_runtime.contracts import Digest, Identifier
|
|
20
|
+
from ksadk.resource_runtime.snapshots import ResourceSnapshot
|
|
21
|
+
from ksadk.skills.loader import load_local_skill
|
|
22
|
+
from ksadk.skills.package_store import PackageStore, SkillPackage, SkillPackageError
|
|
23
|
+
from ksadk.skills.runtime.pinned import PinnedSkillArchive, read_archive, stage_packages
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class LockedSkillPackage(PluginContractModel):
|
|
27
|
+
binding_id: Identifier
|
|
28
|
+
archive: PinnedSkillArchive
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ResourceBuildManifest(PluginContractModel):
|
|
32
|
+
schema_version: Literal[1] = 1
|
|
33
|
+
snapshot: ResourceSnapshot
|
|
34
|
+
packages: tuple[LockedSkillPackage, ...] = ()
|
|
35
|
+
|
|
36
|
+
@field_validator("schema_version", mode="before")
|
|
37
|
+
@classmethod
|
|
38
|
+
def strict_version(cls, value: object) -> object:
|
|
39
|
+
if type(value) is not int:
|
|
40
|
+
raise ValueError("Resource Build schema version must be an integer")
|
|
41
|
+
return value
|
|
42
|
+
|
|
43
|
+
@model_validator(mode="after")
|
|
44
|
+
def exact_selected_packages(self) -> ResourceBuildManifest:
|
|
45
|
+
expected = set()
|
|
46
|
+
for binding in self.snapshot.bindings:
|
|
47
|
+
config = binding.config
|
|
48
|
+
if (
|
|
49
|
+
config.binding.resource.kind == "skill-space"
|
|
50
|
+
and config.selection_mode != "discovery"
|
|
51
|
+
):
|
|
52
|
+
expected.update(
|
|
53
|
+
(config.binding.id, skill.skill_id, skill.version_id, skill.content_hash)
|
|
54
|
+
for skill in config.selected_skills
|
|
55
|
+
)
|
|
56
|
+
actual = [
|
|
57
|
+
(
|
|
58
|
+
item.binding_id,
|
|
59
|
+
item.archive.skill_id,
|
|
60
|
+
item.archive.version_id,
|
|
61
|
+
item.archive.content_hash,
|
|
62
|
+
)
|
|
63
|
+
for item in self.packages
|
|
64
|
+
]
|
|
65
|
+
if len(actual) != len(set(actual)) or set(actual) != expected:
|
|
66
|
+
raise ValueError("Build packages must exactly match pinned resource selections")
|
|
67
|
+
return self
|
|
68
|
+
|
|
69
|
+
def canonical_bytes(self) -> bytes:
|
|
70
|
+
# ResourceSnapshot already normalizes config defaults for its digest.
|
|
71
|
+
payload = {
|
|
72
|
+
"schemaVersion": self.schema_version,
|
|
73
|
+
"snapshotDigest": self.snapshot.digest,
|
|
74
|
+
"packages": [
|
|
75
|
+
item.model_dump(by_alias=True, mode="json")
|
|
76
|
+
for item in sorted(
|
|
77
|
+
self.packages, key=lambda item: (item.binding_id, item.archive.skill_id)
|
|
78
|
+
)
|
|
79
|
+
],
|
|
80
|
+
}
|
|
81
|
+
return json.dumps(
|
|
82
|
+
payload, sort_keys=True, separators=(",", ":"), ensure_ascii=False
|
|
83
|
+
).encode()
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def digest(self) -> str:
|
|
87
|
+
return "sha256:" + hashlib.sha256(self.canonical_bytes()).hexdigest()
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class ResourceBuildReference(PluginContractModel):
|
|
91
|
+
"""Persist this digest in the enclosing immutable Build record."""
|
|
92
|
+
|
|
93
|
+
digest: Digest
|
|
94
|
+
snapshot_digest: Digest
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def write_resource_build(
|
|
98
|
+
directory: Path,
|
|
99
|
+
snapshot: ResourceSnapshot,
|
|
100
|
+
packages: Mapping[str, list[SkillPackage]],
|
|
101
|
+
) -> ResourceBuildReference:
|
|
102
|
+
"""Populate a new caller-owned staging directory, retaining complete ZIPs."""
|
|
103
|
+
if directory.exists():
|
|
104
|
+
raise FileExistsError("Resource Build destination already exists")
|
|
105
|
+
# This private directory is not published until all references and bytes pass;
|
|
106
|
+
# the caller publishes its enclosing Build only on success.
|
|
107
|
+
directory.mkdir(parents=True, mode=0o700)
|
|
108
|
+
locked = []
|
|
109
|
+
try:
|
|
110
|
+
for binding_id, values in packages.items():
|
|
111
|
+
binding = snapshot.binding(binding_id)
|
|
112
|
+
if binding.config.binding.resource.kind != "skill-space":
|
|
113
|
+
raise ValueError("Skill packages require a Skill binding")
|
|
114
|
+
entries = stage_packages(values, directory)
|
|
115
|
+
locked.extend(
|
|
116
|
+
LockedSkillPackage(binding_id=binding_id, archive=entry) for entry in entries
|
|
117
|
+
)
|
|
118
|
+
manifest = ResourceBuildManifest(snapshot=snapshot, packages=tuple(locked))
|
|
119
|
+
(directory / "resource-build.json").write_text(
|
|
120
|
+
manifest.model_dump_json(by_alias=True), encoding="utf-8"
|
|
121
|
+
)
|
|
122
|
+
(directory / "resource-build.json").chmod(0o600)
|
|
123
|
+
reference = ResourceBuildReference(digest=manifest.digest, snapshot_digest=snapshot.digest)
|
|
124
|
+
# Build admission checks extraction as well as the archive hash. Keep the
|
|
125
|
+
# verified ZIPs as the portable artifact, not temporary absolute paths.
|
|
126
|
+
with tempfile.TemporaryDirectory(prefix=".resource-verify-", dir=directory.parent) as cache:
|
|
127
|
+
restore_resource_build(directory, reference, cache_directory=Path(cache))
|
|
128
|
+
return reference
|
|
129
|
+
except Exception:
|
|
130
|
+
import shutil
|
|
131
|
+
|
|
132
|
+
shutil.rmtree(directory)
|
|
133
|
+
raise
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def restore_resource_build(
|
|
137
|
+
directory: Path,
|
|
138
|
+
reference: ResourceBuildReference,
|
|
139
|
+
*,
|
|
140
|
+
cache_directory: Path,
|
|
141
|
+
) -> tuple[ResourceBuildManifest, dict[str, list[SkillPackage]]]:
|
|
142
|
+
"""Restore from saved bytes, without credentials, catalog queries, or env defaults."""
|
|
143
|
+
path = directory / "resource-build.json"
|
|
144
|
+
if directory.is_symlink() or path.is_symlink() or path.stat().st_size > 1024 * 1024:
|
|
145
|
+
raise SkillPackageError("Invalid Resource Build manifest file")
|
|
146
|
+
manifest = ResourceBuildManifest.model_validate_json(path.read_bytes())
|
|
147
|
+
if manifest.digest != reference.digest or manifest.snapshot.digest != reference.snapshot_digest:
|
|
148
|
+
raise SkillPackageError("Resource Build digest mismatch")
|
|
149
|
+
expected_files = {
|
|
150
|
+
"resource-build.json",
|
|
151
|
+
*(item.archive.archive_name for item in manifest.packages),
|
|
152
|
+
}
|
|
153
|
+
if {item.name for item in directory.iterdir()} != expected_files:
|
|
154
|
+
raise SkillPackageError("Resource Build file set mismatch")
|
|
155
|
+
# Namespace is derived from the frozen binding/identity snapshot, not runtime env.
|
|
156
|
+
store = PackageStore(cache_directory, namespace=manifest.snapshot.digest, require_hash=True)
|
|
157
|
+
result: dict[str, list[SkillPackage]] = {}
|
|
158
|
+
for item in manifest.packages:
|
|
159
|
+
package = store.store_archive(
|
|
160
|
+
item.archive.skill_ref(), read_archive(directory / item.archive.archive_name)
|
|
161
|
+
)
|
|
162
|
+
if load_local_skill(package.root_dir).name != item.archive.name:
|
|
163
|
+
raise SkillPackageError("Build Skill name does not match package metadata")
|
|
164
|
+
result.setdefault(item.binding_id, []).append(package)
|
|
165
|
+
return manifest, result
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"""Versioned resource declarations. Credentials are resolved outside these models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
from typing import Annotated, Literal
|
|
8
|
+
|
|
9
|
+
from pydantic import Field, field_validator, model_validator
|
|
10
|
+
|
|
11
|
+
from ksadk.plugins.contracts import PluginContractModel
|
|
12
|
+
|
|
13
|
+
Identifier = Annotated[str, Field(strict=True, min_length=1, max_length=256, pattern=r"^\S+$")]
|
|
14
|
+
Digest = Annotated[str, Field(pattern=r"^sha256:[0-9a-f]{64}$")]
|
|
15
|
+
ResourceKind = Literal["knowledge-base", "memory-instance", "skill-space"]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ResourceRef(PluginContractModel):
|
|
19
|
+
kind: ResourceKind
|
|
20
|
+
id: Identifier
|
|
21
|
+
region: Identifier
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ResourceBinding(PluginContractModel):
|
|
25
|
+
id: Identifier
|
|
26
|
+
connection_ref: Identifier
|
|
27
|
+
resource: ResourceRef
|
|
28
|
+
required: bool = Field(default=True, strict=True)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class RetrievalPolicy(PluginContractModel):
|
|
32
|
+
mode: Literal["tool"] = "tool"
|
|
33
|
+
top_k: int = Field(default=5, ge=1, le=100, strict=True)
|
|
34
|
+
max_chars: int = Field(default=16000, ge=1, le=100000, strict=True)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class SelectedSkill(PluginContractModel):
|
|
38
|
+
skill_id: Identifier
|
|
39
|
+
version_id: Identifier
|
|
40
|
+
content_hash: Digest
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class ResourceConfig(PluginContractModel):
|
|
44
|
+
schema_version: Literal[1] = 1
|
|
45
|
+
binding: ResourceBinding
|
|
46
|
+
retrieval: RetrievalPolicy | None = None
|
|
47
|
+
selection_mode: Literal["pinned", "discovery"] | None = None
|
|
48
|
+
selected_skills: tuple[SelectedSkill, ...] = ()
|
|
49
|
+
include_public: bool = Field(default=False, strict=True)
|
|
50
|
+
execution_mode: Literal["outer-agent", "isolated"] | None = None
|
|
51
|
+
|
|
52
|
+
@field_validator("schema_version", mode="before")
|
|
53
|
+
@classmethod
|
|
54
|
+
def strict_schema_version(cls, value: object) -> object:
|
|
55
|
+
if type(value) is not int:
|
|
56
|
+
raise ValueError("schemaVersion must be an integer")
|
|
57
|
+
return value
|
|
58
|
+
|
|
59
|
+
@model_validator(mode="after")
|
|
60
|
+
def validate_resource_policy(self) -> ResourceConfig:
|
|
61
|
+
kind = self.binding.resource.kind
|
|
62
|
+
if kind != "knowledge-base" and self.retrieval is not None:
|
|
63
|
+
raise ValueError("retrieval is only valid for knowledge-base bindings")
|
|
64
|
+
if kind != "skill-space":
|
|
65
|
+
if (
|
|
66
|
+
self.selection_mode is not None
|
|
67
|
+
or self.selected_skills
|
|
68
|
+
or self.include_public
|
|
69
|
+
or self.execution_mode is not None
|
|
70
|
+
):
|
|
71
|
+
raise ValueError("Skill policies require a skill-space binding")
|
|
72
|
+
else:
|
|
73
|
+
identities = [skill.skill_id for skill in self.selected_skills]
|
|
74
|
+
if len(identities) != len(set(identities)):
|
|
75
|
+
raise ValueError("a Skill may only be selected once")
|
|
76
|
+
if self.selection_mode == "discovery" and self.selected_skills:
|
|
77
|
+
raise ValueError("discovery cannot declare pinned selectedSkills")
|
|
78
|
+
return self
|
|
79
|
+
|
|
80
|
+
def canonical_bytes(self) -> bytes:
|
|
81
|
+
"""Normalize omitted defaults before hashing; lists are immutable tuples."""
|
|
82
|
+
data = self.model_dump(by_alias=True, mode="json", exclude_none=True)
|
|
83
|
+
if self.binding.resource.kind == "knowledge-base":
|
|
84
|
+
data["retrieval"] = (self.retrieval or RetrievalPolicy()).model_dump(by_alias=True)
|
|
85
|
+
if self.binding.resource.kind == "skill-space":
|
|
86
|
+
data["selectionMode"] = self.selection_mode or "pinned"
|
|
87
|
+
data["executionMode"] = self.execution_mode or "outer-agent"
|
|
88
|
+
return json.dumps(
|
|
89
|
+
data, ensure_ascii=False, sort_keys=True, separators=(",", ":"), allow_nan=False
|
|
90
|
+
).encode("utf-8")
|
|
91
|
+
|
|
92
|
+
@property
|
|
93
|
+
def digest(self) -> str:
|
|
94
|
+
return "sha256:" + hashlib.sha256(self.canonical_bytes()).hexdigest()
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def validate_resource_bindings(configs: tuple[ResourceConfig, ...]) -> None:
|
|
98
|
+
"""First release supports one binding of each resource kind per Agent."""
|
|
99
|
+
ids = [config.binding.id for config in configs]
|
|
100
|
+
kinds = [config.binding.resource.kind for config in configs]
|
|
101
|
+
if len(ids) != len(set(ids)):
|
|
102
|
+
raise ValueError("resource binding IDs must be unique within an Agent")
|
|
103
|
+
if len(kinds) != len(set(kinds)):
|
|
104
|
+
raise ValueError("only one resource binding of each kind is supported")
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class InvocationIdentity(PluginContractModel):
|
|
108
|
+
"""Resolved by the trusted host, never taken from model tool arguments.
|
|
109
|
+
|
|
110
|
+
Resource credentials and the human whose memories are accessed need not
|
|
111
|
+
represent the same principal. A worker activation belongs to one identity.
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
tenant_ref: Identifier
|
|
115
|
+
resource_principal_ref: Identifier
|
|
116
|
+
actor_ref: Identifier
|
|
117
|
+
memory_subject_ref: Identifier
|
|
118
|
+
agent_id: Identifier
|
|
119
|
+
session_ref: Identifier
|
|
120
|
+
|
|
121
|
+
def memory_partition(self, resource: ResourceRef) -> str:
|
|
122
|
+
"""Stable across sessions/activations; account and resource remain isolated."""
|
|
123
|
+
if resource.kind != "memory-instance":
|
|
124
|
+
raise ValueError("memory partition requires a memory-instance")
|
|
125
|
+
parts = [
|
|
126
|
+
"memory-partition/v1",
|
|
127
|
+
self.tenant_ref,
|
|
128
|
+
self.resource_principal_ref,
|
|
129
|
+
resource.kind,
|
|
130
|
+
resource.id,
|
|
131
|
+
resource.region,
|
|
132
|
+
self.agent_id,
|
|
133
|
+
self.memory_subject_ref,
|
|
134
|
+
]
|
|
135
|
+
encoded = json.dumps(parts, ensure_ascii=False, separators=(",", ":")).encode()
|
|
136
|
+
# AICP AgentUserId accepts at most 64 characters. Keep the versioned
|
|
137
|
+
# prefix and 240 bits of the partition digest inside that wire limit.
|
|
138
|
+
return "mp1-" + hashlib.sha256(encoded).hexdigest()[:60]
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Host-owned discovery selections in the existing operation ledger.
|
|
2
|
+
|
|
3
|
+
Receipts pin identity and cache lookup fields, never grant permission or contain
|
|
4
|
+
URLs. The runner supplies a stable logical run reference across recovery.
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import hashlib
|
|
9
|
+
import json
|
|
10
|
+
import re
|
|
11
|
+
|
|
12
|
+
from pydantic import Field
|
|
13
|
+
|
|
14
|
+
from ksadk.resource_runtime.contracts import SelectedSkill
|
|
15
|
+
from ksadk.resource_runtime.leases import ResourceScope
|
|
16
|
+
from ksadk.resource_runtime.operation_ledger import OperationConflict, OperationLedger
|
|
17
|
+
from ksadk.skills.models import ContentHash, SkillRef
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class DiscoverySkillReceipt(SelectedSkill):
|
|
21
|
+
name: str = Field(strict=True, min_length=1, max_length=256)
|
|
22
|
+
version: str = Field(default="", strict=True, max_length=256)
|
|
23
|
+
|
|
24
|
+
@classmethod
|
|
25
|
+
def from_ref(cls, ref: SkillRef):
|
|
26
|
+
return cls(
|
|
27
|
+
skill_id=ref.skill_id, version_id=ref.version_id,
|
|
28
|
+
content_hash=ref.content_hash.render() if ref.content_hash else "",
|
|
29
|
+
name=ref.name, version=ref.version,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
def to_ref(self) -> SkillRef:
|
|
33
|
+
return SkillRef(
|
|
34
|
+
skill_id=self.skill_id, version_id=self.version_id,
|
|
35
|
+
name=self.name, version=self.version,
|
|
36
|
+
content_hash=ContentHash.parse(self.content_hash),
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def discovery_scope_key(scope: ResourceScope, run_ref: str) -> str:
|
|
41
|
+
if not isinstance(run_ref, str) or not 1 <= len(run_ref) <= 256:
|
|
42
|
+
raise ValueError("Discovery requires a stable host run reference")
|
|
43
|
+
return hashlib.sha256(json.dumps([
|
|
44
|
+
"discovery-selection-v1", run_ref,
|
|
45
|
+
scope.identity.model_dump(by_alias=True, mode="json"),
|
|
46
|
+
scope.build_digest, scope.binding_snapshot_digest, scope.binding_id,
|
|
47
|
+
], sort_keys=True, separators=(",", ":")).encode()).hexdigest()
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class DiscoverySelectionReceipts:
|
|
51
|
+
def __init__(self, ledger: OperationLedger):
|
|
52
|
+
self.ledger = ledger
|
|
53
|
+
with ledger._connect() as connection:
|
|
54
|
+
connection.execute(
|
|
55
|
+
"CREATE TABLE IF NOT EXISTS discovery_selections ("
|
|
56
|
+
"scope_key TEXT NOT NULL, skill_id TEXT NOT NULL, payload TEXT NOT NULL, "
|
|
57
|
+
"PRIMARY KEY(scope_key, skill_id))"
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
@staticmethod
|
|
61
|
+
def _key(value):
|
|
62
|
+
if not isinstance(value, str) or not re.fullmatch(r"[0-9a-f]{64}", value):
|
|
63
|
+
raise ValueError("Invalid discovery scope")
|
|
64
|
+
return value
|
|
65
|
+
|
|
66
|
+
def read(self, scope_key: str) -> tuple[DiscoverySkillReceipt, ...]:
|
|
67
|
+
with self.ledger._connect() as connection:
|
|
68
|
+
rows = connection.execute(
|
|
69
|
+
"SELECT skill_id,payload FROM discovery_selections WHERE scope_key=? "
|
|
70
|
+
"ORDER BY skill_id LIMIT 33", (self._key(scope_key),),
|
|
71
|
+
).fetchall()
|
|
72
|
+
if len(rows) > 32:
|
|
73
|
+
raise OperationConflict("Discovery selection limit exceeded")
|
|
74
|
+
results = tuple(DiscoverySkillReceipt.model_validate_json(row[1]) for row in rows)
|
|
75
|
+
if any(row[0] != result.skill_id for row, result in zip(rows, results)):
|
|
76
|
+
raise OperationConflict("Discovery selection identity mismatch")
|
|
77
|
+
return results
|
|
78
|
+
|
|
79
|
+
def record(self, scope_key: str, receipt: DiscoverySkillReceipt) -> None:
|
|
80
|
+
scope_key = self._key(scope_key)
|
|
81
|
+
receipt = DiscoverySkillReceipt.model_validate(receipt.model_dump())
|
|
82
|
+
with self.ledger._connect() as connection:
|
|
83
|
+
connection.execute("BEGIN IMMEDIATE")
|
|
84
|
+
previous = connection.execute(
|
|
85
|
+
"SELECT payload FROM discovery_selections WHERE scope_key=? AND skill_id=?",
|
|
86
|
+
(scope_key, receipt.skill_id),
|
|
87
|
+
).fetchone()
|
|
88
|
+
if previous:
|
|
89
|
+
if DiscoverySkillReceipt.model_validate_json(previous[0]) != receipt:
|
|
90
|
+
raise OperationConflict("Discovery selection cannot change within a run")
|
|
91
|
+
return
|
|
92
|
+
count = connection.execute(
|
|
93
|
+
"SELECT COUNT(*) FROM discovery_selections WHERE scope_key=?", (scope_key,),
|
|
94
|
+
).fetchone()[0]
|
|
95
|
+
if count >= 32:
|
|
96
|
+
raise OperationConflict("Discovery selection limit exceeded")
|
|
97
|
+
connection.execute(
|
|
98
|
+
"INSERT INTO discovery_selections VALUES (?,?,?)",
|
|
99
|
+
(scope_key, receipt.skill_id, receipt.model_dump_json(by_alias=True)),
|
|
100
|
+
)
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""Dynamic discovery with host-restored run selections in one admitted Skill space."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import replace
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from threading import RLock
|
|
8
|
+
|
|
9
|
+
from ksadk.resource_runtime.contracts import ResourceConfig
|
|
10
|
+
from ksadk.resource_runtime.discovery_receipts import DiscoverySkillReceipt
|
|
11
|
+
from ksadk.resource_runtime.skills import (
|
|
12
|
+
PinnedSkillService,
|
|
13
|
+
SkillExecutionQuery,
|
|
14
|
+
SkillResourceQuery,
|
|
15
|
+
SkillSearchQuery,
|
|
16
|
+
)
|
|
17
|
+
from ksadk.resource_runtime.snapshots import SkillExecutionTarget
|
|
18
|
+
from ksadk.skills.package_store import PackageStore, SkillPackageError
|
|
19
|
+
from ksadk.skills.runtime.registry import match_skill_refs
|
|
20
|
+
from ksadk.skills.service_client import SkillServiceClient
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class DiscoverySkillService(PinnedSkillService):
|
|
24
|
+
"""Reuse the verified-package read contract while selecting from a live catalog.
|
|
25
|
+
|
|
26
|
+
A first load fixes a version; every subsequent read checks cached bytes. The
|
|
27
|
+
host commits a receipt before exposing content and supplies restored selections
|
|
28
|
+
when resuming a logical run. This does not claim native engine discovery.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
config: ResourceConfig,
|
|
34
|
+
client: SkillServiceClient,
|
|
35
|
+
*,
|
|
36
|
+
cache_directory: Path,
|
|
37
|
+
namespace: str,
|
|
38
|
+
restored_selections: tuple[DiscoverySkillReceipt, ...] = (),
|
|
39
|
+
execution_target: SkillExecutionTarget | None = None,
|
|
40
|
+
):
|
|
41
|
+
self.config = ResourceConfig.model_validate(config.model_dump())
|
|
42
|
+
if (
|
|
43
|
+
self.config.binding.resource.kind != "skill-space"
|
|
44
|
+
or self.config.selection_mode != "discovery"
|
|
45
|
+
or self.config.include_public
|
|
46
|
+
or client.allow_env_fallback
|
|
47
|
+
):
|
|
48
|
+
raise ValueError("Discovery requires one explicit non-public Skill space")
|
|
49
|
+
self.client = client
|
|
50
|
+
self.execution_target = (
|
|
51
|
+
SkillExecutionTarget.model_validate(execution_target.model_dump())
|
|
52
|
+
if execution_target is not None else None
|
|
53
|
+
)
|
|
54
|
+
if self.execution_target is not None and self.config.execution_mode != "isolated":
|
|
55
|
+
raise ValueError("Discovery execution target requires isolated mode")
|
|
56
|
+
self.store = PackageStore(cache_directory, namespace=namespace, require_hash=True)
|
|
57
|
+
receipts = tuple(
|
|
58
|
+
DiscoverySkillReceipt.model_validate(item.model_dump()) for item in restored_selections
|
|
59
|
+
)
|
|
60
|
+
if len(receipts) > 32 or len({item.skill_id for item in receipts}) != len(receipts):
|
|
61
|
+
raise ValueError("Invalid restored discovery selections")
|
|
62
|
+
self._selected = {item.skill_id: item.to_ref() for item in receipts}
|
|
63
|
+
self._lock = RLock()
|
|
64
|
+
|
|
65
|
+
def _catalog(self):
|
|
66
|
+
with self._lock:
|
|
67
|
+
listing = self.client.list_skills_by_space_id(self.config.binding.resource.id)
|
|
68
|
+
if listing.space_id != self.config.binding.resource.id:
|
|
69
|
+
raise SkillPackageError("Skill catalog does not match admitted space")
|
|
70
|
+
refs = {}
|
|
71
|
+
for ref in listing.active_skills(allow_partial=True):
|
|
72
|
+
DiscoverySkillReceipt.from_ref(ref)
|
|
73
|
+
if not ref.name or len(ref.name) > 256 or ref.skill_id in refs:
|
|
74
|
+
raise SkillPackageError("Skill catalog contains invalid identities")
|
|
75
|
+
refs[ref.skill_id] = self._selected.get(ref.skill_id, ref)
|
|
76
|
+
return refs, listing.truncated
|
|
77
|
+
|
|
78
|
+
def list_skills(self, arguments: dict) -> dict:
|
|
79
|
+
if arguments:
|
|
80
|
+
raise ValueError("Skill catalog accepts no space override")
|
|
81
|
+
refs, partial = self._catalog()
|
|
82
|
+
ordered = sorted(refs.values(), key=lambda item: item.skill_id)
|
|
83
|
+
return {
|
|
84
|
+
"status": "ok",
|
|
85
|
+
"truncated": partial or len(ordered) > 128,
|
|
86
|
+
"items": [
|
|
87
|
+
{
|
|
88
|
+
"skillId": ref.skill_id,
|
|
89
|
+
"versionId": ref.version_id,
|
|
90
|
+
"name": ref.name,
|
|
91
|
+
"contentHash": ref.content_hash.render(),
|
|
92
|
+
}
|
|
93
|
+
for ref in ordered[:128]
|
|
94
|
+
],
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
def search_skills(self, arguments: dict) -> dict:
|
|
98
|
+
query = SkillSearchQuery.model_validate(arguments)
|
|
99
|
+
if not query.query.strip():
|
|
100
|
+
raise ValueError("Skill query cannot be blank")
|
|
101
|
+
refs, partial = self._catalog()
|
|
102
|
+
matches = match_skill_refs(list(refs.values()), query.query)
|
|
103
|
+
return {
|
|
104
|
+
"status": "ok",
|
|
105
|
+
"truncated": partial or len(matches) > query.max_results,
|
|
106
|
+
"items": [
|
|
107
|
+
{
|
|
108
|
+
"skillId": match.skill.skill_id,
|
|
109
|
+
"versionId": match.skill.version_id,
|
|
110
|
+
"name": match.skill.name,
|
|
111
|
+
"contentHash": match.skill.content_hash.render(),
|
|
112
|
+
"description": match.skill.description[:8192],
|
|
113
|
+
"score": match.score,
|
|
114
|
+
"reason": match.reason,
|
|
115
|
+
}
|
|
116
|
+
for match in matches[: query.max_results]
|
|
117
|
+
],
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
def read_resource(self, arguments: dict) -> dict:
|
|
121
|
+
query = SkillResourceQuery.model_validate(arguments)
|
|
122
|
+
with self._lock:
|
|
123
|
+
if query.skill_id not in self._selected:
|
|
124
|
+
if len(self._selected) >= 32:
|
|
125
|
+
raise SkillPackageError("Activation Skill selection limit exceeded")
|
|
126
|
+
refs, _ = self._catalog()
|
|
127
|
+
ref = refs.get(query.skill_id)
|
|
128
|
+
if ref is None:
|
|
129
|
+
raise SkillPackageError("Skill is not in the admitted catalog")
|
|
130
|
+
# A download URL is obtained by the client and never retained in
|
|
131
|
+
# the chosen reference or returned to consumers.
|
|
132
|
+
ref = replace(ref, archive_uri="")
|
|
133
|
+
package = self.store.get_cached(ref)
|
|
134
|
+
if package is None:
|
|
135
|
+
package = self.store.store_archive(ref, self.client.download_skill_archive(ref))
|
|
136
|
+
self._selected[query.skill_id] = ref
|
|
137
|
+
return super().read_resource(arguments)
|
|
138
|
+
|
|
139
|
+
def _packages(self):
|
|
140
|
+
with self._lock:
|
|
141
|
+
packages = {key: self.store.get_cached(ref) for key, ref in self._selected.items()}
|
|
142
|
+
if any(package is None for package in packages.values()):
|
|
143
|
+
raise SkillPackageError("Selected Skill cache integrity failed")
|
|
144
|
+
return packages
|
|
145
|
+
|
|
146
|
+
def _restore(self):
|
|
147
|
+
return self.config, self._packages(), self.execution_target
|
|
148
|
+
|
|
149
|
+
def execute(self, arguments, *, approved_selections=(), **kwargs):
|
|
150
|
+
if self.execution_target is None:
|
|
151
|
+
raise ValueError("Discovery execution has no admitted runtime adapter")
|
|
152
|
+
query = SkillExecutionQuery.model_validate(arguments)
|
|
153
|
+
approved = {
|
|
154
|
+
item.skill_id: item
|
|
155
|
+
for item in (
|
|
156
|
+
DiscoverySkillReceipt.model_validate(value.model_dump())
|
|
157
|
+
for value in approved_selections
|
|
158
|
+
)
|
|
159
|
+
}
|
|
160
|
+
if len(approved) != len(approved_selections) or set(approved) != set(query.skill_ids):
|
|
161
|
+
raise ValueError("Discovery execution requires exact committed selections")
|
|
162
|
+
with self._lock:
|
|
163
|
+
if any(
|
|
164
|
+
key not in self._selected
|
|
165
|
+
or DiscoverySkillReceipt.from_ref(self._selected[key]) != receipt
|
|
166
|
+
for key, receipt in approved.items()
|
|
167
|
+
):
|
|
168
|
+
raise ValueError("Discovery execution selection mismatch")
|
|
169
|
+
return super().execute(arguments, **kwargs)
|
|
170
|
+
|
|
171
|
+
def close(self):
|
|
172
|
+
self.client.close()
|