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,102 @@
|
|
|
1
|
+
"""Deterministic, dependency-free calendar calculations for Scheduler Lite.
|
|
2
|
+
|
|
3
|
+
The supported cron dialect intentionally stays small and explicit: five fields,
|
|
4
|
+
numeric values, comma lists, ranges and ``*/step``. It is sufficient for the
|
|
5
|
+
Studio scheduler and avoids inheriting an accidental transitive dependency.
|
|
6
|
+
All matching happens after UTC -> IANA timezone conversion. That means a
|
|
7
|
+
nonexistent DST local minute is skipped and the repeated fall-back minute runs
|
|
8
|
+
once (the first ``fold`` only).
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from datetime import datetime, timedelta, timezone
|
|
14
|
+
from zoneinfo import ZoneInfo
|
|
15
|
+
|
|
16
|
+
from ksadk.scheduler.contracts import ScheduleSpec, _parse_cron
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def next_schedule_time(
|
|
20
|
+
schedule: ScheduleSpec,
|
|
21
|
+
*,
|
|
22
|
+
after: datetime,
|
|
23
|
+
anchor_at: datetime | None = None,
|
|
24
|
+
) -> datetime | None:
|
|
25
|
+
"""Return the first scheduled UTC timestamp strictly after ``after``."""
|
|
26
|
+
|
|
27
|
+
if after.tzinfo is None:
|
|
28
|
+
raise ValueError("after must include a timezone")
|
|
29
|
+
after = after.astimezone(timezone.utc)
|
|
30
|
+
if schedule.kind == "once":
|
|
31
|
+
assert schedule.at is not None
|
|
32
|
+
return schedule.at if schedule.at > after else None
|
|
33
|
+
if schedule.kind == "interval":
|
|
34
|
+
assert schedule.every_seconds is not None
|
|
35
|
+
anchor = (schedule.anchor_at or anchor_at or after).astimezone(timezone.utc)
|
|
36
|
+
if anchor > after:
|
|
37
|
+
return anchor
|
|
38
|
+
elapsed = (after - anchor).total_seconds()
|
|
39
|
+
step = schedule.every_seconds
|
|
40
|
+
return anchor + timedelta(seconds=(int(elapsed // step) + 1) * step)
|
|
41
|
+
assert schedule.expression is not None
|
|
42
|
+
return _next_cron(schedule.expression, schedule.timezone, after)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _next_cron(expression: str, timezone_name: str, after: datetime) -> datetime:
|
|
46
|
+
minute, hour, day, month, weekday = _parse_cron(expression)
|
|
47
|
+
fields = (
|
|
48
|
+
_expand_field(minute, 0, 59),
|
|
49
|
+
_expand_field(hour, 0, 23),
|
|
50
|
+
_expand_field(day, 1, 31),
|
|
51
|
+
_expand_field(month, 1, 12),
|
|
52
|
+
_expand_field(weekday, 0, 6),
|
|
53
|
+
)
|
|
54
|
+
zone = ZoneInfo(timezone_name)
|
|
55
|
+
candidate = after.replace(second=0, microsecond=0) + timedelta(minutes=1)
|
|
56
|
+
# Five years is a deliberate guard against impossible expressions such as
|
|
57
|
+
# 31 February. The caller receives a typed validation error rather than a
|
|
58
|
+
# scheduler loop that runs forever.
|
|
59
|
+
deadline = candidate + timedelta(days=366 * 5)
|
|
60
|
+
while candidate <= deadline:
|
|
61
|
+
local = candidate.astimezone(zone)
|
|
62
|
+
# datetime.weekday uses Monday=0. Cron uses Sunday=0.
|
|
63
|
+
cron_weekday = (local.weekday() + 1) % 7
|
|
64
|
+
if (
|
|
65
|
+
local.fold == 0
|
|
66
|
+
and local.minute in fields[0]
|
|
67
|
+
and local.hour in fields[1]
|
|
68
|
+
and local.day in fields[2]
|
|
69
|
+
and local.month in fields[3]
|
|
70
|
+
and cron_weekday in fields[4]
|
|
71
|
+
):
|
|
72
|
+
return candidate
|
|
73
|
+
candidate += timedelta(minutes=1)
|
|
74
|
+
raise ValueError("cron expression has no matching time within five years")
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _expand_field(value: str, minimum: int, maximum: int) -> set[int]:
|
|
78
|
+
result: set[int] = set()
|
|
79
|
+
for item in value.split(","):
|
|
80
|
+
if "/" in item:
|
|
81
|
+
base, step_text = item.split("/", 1)
|
|
82
|
+
else:
|
|
83
|
+
base, step_text = item, None
|
|
84
|
+
step = int(step_text) if step_text is not None else 1
|
|
85
|
+
if step <= 0:
|
|
86
|
+
raise ValueError("cron step must be positive")
|
|
87
|
+
if base == "*":
|
|
88
|
+
start, end = minimum, maximum
|
|
89
|
+
elif "-" in base:
|
|
90
|
+
start_text, end_text = base.split("-", 1)
|
|
91
|
+
start, end = int(start_text), int(end_text)
|
|
92
|
+
else:
|
|
93
|
+
start = end = int(base)
|
|
94
|
+
if start < minimum or end > maximum or start > end:
|
|
95
|
+
raise ValueError("cron field is outside its valid range")
|
|
96
|
+
result.update(range(start, end + 1, step))
|
|
97
|
+
if not result:
|
|
98
|
+
raise ValueError("cron field must not be empty")
|
|
99
|
+
return result
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
__all__ = ["next_schedule_time"]
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"""Versioned Scheduler Lite source contracts (P2-06 foundation)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
from datetime import datetime, timezone
|
|
7
|
+
from typing import Any, Literal
|
|
8
|
+
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
|
|
9
|
+
|
|
10
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _to_camel(value: str) -> str:
|
|
14
|
+
head, *tail = value.split("_")
|
|
15
|
+
return head + "".join(part.capitalize() for part in tail)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ScheduleModel(BaseModel):
|
|
19
|
+
model_config = ConfigDict(
|
|
20
|
+
alias_generator=_to_camel,
|
|
21
|
+
populate_by_name=True,
|
|
22
|
+
extra="forbid",
|
|
23
|
+
frozen=True,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
_TASK_ID = re.compile(r"^[a-z][a-z0-9-]{2,62}$")
|
|
28
|
+
ScheduleOccurrenceState = Literal[
|
|
29
|
+
"claimed",
|
|
30
|
+
"accepted",
|
|
31
|
+
"running",
|
|
32
|
+
"succeeded",
|
|
33
|
+
"failed",
|
|
34
|
+
"skipped",
|
|
35
|
+
"cancelled",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class ScheduleSpec(ScheduleModel):
|
|
40
|
+
kind: Literal["once", "interval", "cron"]
|
|
41
|
+
timezone: str = "UTC"
|
|
42
|
+
at: datetime | None = None
|
|
43
|
+
every_seconds: int | None = Field(default=None, ge=60, le=31_536_000)
|
|
44
|
+
anchor_at: datetime | None = None
|
|
45
|
+
expression: str | None = Field(default=None, min_length=9, max_length=128)
|
|
46
|
+
misfire_policy: Literal["skip", "run_once"] = "skip"
|
|
47
|
+
|
|
48
|
+
@field_validator("timezone")
|
|
49
|
+
@classmethod
|
|
50
|
+
def validate_timezone(cls, value: str) -> str:
|
|
51
|
+
try:
|
|
52
|
+
ZoneInfo(value)
|
|
53
|
+
except ZoneInfoNotFoundError as error:
|
|
54
|
+
raise ValueError("timezone must be an IANA timezone") from error
|
|
55
|
+
return value
|
|
56
|
+
|
|
57
|
+
@field_validator("at", "anchor_at")
|
|
58
|
+
@classmethod
|
|
59
|
+
def normalize_timestamp(cls, value: datetime | None) -> datetime | None:
|
|
60
|
+
if value is None:
|
|
61
|
+
return None
|
|
62
|
+
if value.tzinfo is None:
|
|
63
|
+
raise ValueError("schedule timestamps must include a timezone")
|
|
64
|
+
return value.astimezone(timezone.utc)
|
|
65
|
+
|
|
66
|
+
@model_validator(mode="after")
|
|
67
|
+
def validate_kind_shape(self) -> "ScheduleSpec":
|
|
68
|
+
if self.kind == "once":
|
|
69
|
+
if self.at is None or self.every_seconds is not None or self.expression is not None:
|
|
70
|
+
raise ValueError("once schedule requires only at")
|
|
71
|
+
elif self.kind == "interval":
|
|
72
|
+
if self.every_seconds is None or self.at is not None or self.expression is not None:
|
|
73
|
+
raise ValueError("interval schedule requires everySeconds and no expression")
|
|
74
|
+
elif self.kind == "cron":
|
|
75
|
+
if self.expression is None or self.at is not None or self.every_seconds is not None:
|
|
76
|
+
raise ValueError("cron schedule requires only expression")
|
|
77
|
+
_parse_cron(self.expression)
|
|
78
|
+
return self
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class ScheduledTaskTarget(ScheduleModel):
|
|
82
|
+
# ``agent_instance_id`` identifies the concrete Kernel owner which will
|
|
83
|
+
# consume an Inbox command. ``agent_id`` is the Studio-facing stable
|
|
84
|
+
# logical Agent identity used to retain a task on its detail page even when
|
|
85
|
+
# the task is pinned to an older immutable Build. It is optional only so
|
|
86
|
+
# existing v1 SQLite rows remain readable; all Studio-authored tasks set it.
|
|
87
|
+
agent_id: str | None = Field(default=None, min_length=1, max_length=256)
|
|
88
|
+
tenant_id: str = Field(min_length=1, max_length=256)
|
|
89
|
+
agent_instance_id: str = Field(min_length=1, max_length=256)
|
|
90
|
+
agent_version_ref: str | None = Field(default=None, min_length=1, max_length=256)
|
|
91
|
+
session_id: str | None = Field(default=None, min_length=1, max_length=256)
|
|
92
|
+
authorization_ref: str = Field(min_length=1, max_length=512)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class ScheduleCommandTemplate(ScheduleModel):
|
|
96
|
+
"""The sole supported Scheduler Lite action: durable enqueue via AgentControl."""
|
|
97
|
+
|
|
98
|
+
command_type: Literal["enqueue"] = "enqueue"
|
|
99
|
+
payload: dict[str, Any]
|
|
100
|
+
|
|
101
|
+
@model_validator(mode="after")
|
|
102
|
+
def validate_payload(self) -> "ScheduleCommandTemplate":
|
|
103
|
+
if "content" not in self.payload:
|
|
104
|
+
raise ValueError("scheduled enqueue payload requires content")
|
|
105
|
+
_reject_clear_secrets(self.payload)
|
|
106
|
+
return self
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class ScheduledTask(ScheduleModel):
|
|
110
|
+
api_version: Literal["schedule.ksadk.io/v1"] = "schedule.ksadk.io/v1"
|
|
111
|
+
kind: Literal["ScheduledTask"] = "ScheduledTask"
|
|
112
|
+
schema_version: Literal[1] = 1
|
|
113
|
+
task_id: str = Field(min_length=3, max_length=63)
|
|
114
|
+
# A human-facing task label belongs to the durable schedule intent, not a
|
|
115
|
+
# transient Studio card. Optional keeps the previously frozen v1 rows
|
|
116
|
+
# and third-party producers readable during this additive transition.
|
|
117
|
+
display_name: str | None = Field(default=None, min_length=1, max_length=128)
|
|
118
|
+
target: ScheduledTaskTarget
|
|
119
|
+
schedule: ScheduleSpec
|
|
120
|
+
command: ScheduleCommandTemplate
|
|
121
|
+
enabled: bool = True
|
|
122
|
+
continuity: Literal["new_session", "continue_session"] = "new_session"
|
|
123
|
+
concurrency_policy: Literal["forbid"] = "forbid"
|
|
124
|
+
next_run_at: datetime | None = None
|
|
125
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
|
126
|
+
updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
|
127
|
+
|
|
128
|
+
@field_validator("task_id")
|
|
129
|
+
@classmethod
|
|
130
|
+
def validate_task_id(cls, value: str) -> str:
|
|
131
|
+
if not _TASK_ID.fullmatch(value):
|
|
132
|
+
raise ValueError("taskId must be a lowercase stable identifier")
|
|
133
|
+
return value
|
|
134
|
+
|
|
135
|
+
@model_validator(mode="after")
|
|
136
|
+
def validate_continuity_target(self) -> "ScheduledTask":
|
|
137
|
+
if self.continuity == "continue_session" and not self.target.session_id:
|
|
138
|
+
raise ValueError("continue_session schedule requires target.sessionId")
|
|
139
|
+
return self
|
|
140
|
+
|
|
141
|
+
@field_validator("next_run_at", "created_at", "updated_at")
|
|
142
|
+
@classmethod
|
|
143
|
+
def normalize_timestamp(cls, value: datetime | None) -> datetime | None:
|
|
144
|
+
if value is None:
|
|
145
|
+
return None
|
|
146
|
+
if value.tzinfo is None:
|
|
147
|
+
raise ValueError("scheduler timestamps must include a timezone")
|
|
148
|
+
return value.astimezone(timezone.utc)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class ScheduleOccurrenceTransition(ScheduleModel):
|
|
152
|
+
"""One durable state change displayed by Studio's execution history."""
|
|
153
|
+
|
|
154
|
+
state: ScheduleOccurrenceState
|
|
155
|
+
at: datetime
|
|
156
|
+
detail: str | None = Field(default=None, max_length=1024)
|
|
157
|
+
error_code: str | None = Field(default=None, max_length=128)
|
|
158
|
+
|
|
159
|
+
@field_validator("at")
|
|
160
|
+
@classmethod
|
|
161
|
+
def normalize_timestamp(cls, value: datetime) -> datetime:
|
|
162
|
+
if value.tzinfo is None:
|
|
163
|
+
raise ValueError("occurrence transition timestamps must include a timezone")
|
|
164
|
+
return value.astimezone(timezone.utc)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class ScheduleOccurrence(ScheduleModel):
|
|
168
|
+
api_version: Literal["schedule.ksadk.io/v1"] = "schedule.ksadk.io/v1"
|
|
169
|
+
kind: Literal["ScheduleOccurrence"] = "ScheduleOccurrence"
|
|
170
|
+
schema_version: Literal[1] = 1
|
|
171
|
+
occurrence_id: str = Field(min_length=8, max_length=256)
|
|
172
|
+
task_id: str = Field(min_length=3, max_length=63)
|
|
173
|
+
# Keep the execution target as an immutable occurrence snapshot. Tasks can
|
|
174
|
+
# later be edited or deleted, but history/reconciliation must still know
|
|
175
|
+
# exactly which Agent revision accepted this occurrence.
|
|
176
|
+
target: ScheduledTaskTarget | None = None
|
|
177
|
+
scheduled_for: datetime
|
|
178
|
+
session_id: str = Field(min_length=1, max_length=256)
|
|
179
|
+
trigger: Literal["schedule", "manual"] = "schedule"
|
|
180
|
+
state: ScheduleOccurrenceState
|
|
181
|
+
attempt: int = Field(default=1, ge=1, le=100)
|
|
182
|
+
command_id: str | None = None
|
|
183
|
+
accepted_seq: int | None = Field(default=None, ge=0)
|
|
184
|
+
last_event_seq: int | None = Field(default=None, ge=0)
|
|
185
|
+
run_id: str | None = Field(default=None, min_length=1, max_length=256)
|
|
186
|
+
claimed_at: datetime | None = None
|
|
187
|
+
accepted_at: datetime | None = None
|
|
188
|
+
started_at: datetime | None = None
|
|
189
|
+
error_code: str | None = Field(default=None, max_length=128)
|
|
190
|
+
detail: str | None = Field(default=None, max_length=1024)
|
|
191
|
+
completed_at: datetime | None = None
|
|
192
|
+
transitions: tuple[ScheduleOccurrenceTransition, ...] = ()
|
|
193
|
+
|
|
194
|
+
@field_validator("scheduled_for", "claimed_at", "accepted_at", "started_at", "completed_at")
|
|
195
|
+
@classmethod
|
|
196
|
+
def normalize_timestamp(cls, value: datetime | None) -> datetime | None:
|
|
197
|
+
if value is None:
|
|
198
|
+
return None
|
|
199
|
+
if value.tzinfo is None:
|
|
200
|
+
raise ValueError("occurrence timestamps must include a timezone")
|
|
201
|
+
return value.astimezone(timezone.utc)
|
|
202
|
+
|
|
203
|
+
@model_validator(mode="after")
|
|
204
|
+
def validate_terminal_fields(self) -> "ScheduleOccurrence":
|
|
205
|
+
terminal = {"succeeded", "failed", "skipped", "cancelled"}
|
|
206
|
+
if self.state in terminal and self.completed_at is None:
|
|
207
|
+
raise ValueError("terminal occurrence requires completedAt")
|
|
208
|
+
if self.state == "failed" and not self.error_code:
|
|
209
|
+
raise ValueError("failed occurrence requires errorCode")
|
|
210
|
+
if self.state == "running" and (not self.run_id or self.started_at is None):
|
|
211
|
+
raise ValueError("running occurrence requires runId and startedAt")
|
|
212
|
+
if self.transitions:
|
|
213
|
+
timestamps = [transition.at for transition in self.transitions]
|
|
214
|
+
if timestamps != sorted(timestamps):
|
|
215
|
+
raise ValueError("occurrence transitions must be chronological")
|
|
216
|
+
if self.transitions[-1].state != self.state:
|
|
217
|
+
raise ValueError("last occurrence transition must match state")
|
|
218
|
+
return self
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def _reject_clear_secrets(value: Any, *, key: str = "payload") -> None:
|
|
222
|
+
if isinstance(value, dict):
|
|
223
|
+
for name, item in value.items():
|
|
224
|
+
lowered = str(name).lower()
|
|
225
|
+
if any(term in lowered for term in ("secret", "password", "token", "api_key")):
|
|
226
|
+
if not isinstance(item, str) or not item.startswith(
|
|
227
|
+
("env://", "secret://", "credential://", "vault://")
|
|
228
|
+
):
|
|
229
|
+
raise ValueError(f"{key}.{name} must be a secret reference, not a value")
|
|
230
|
+
_reject_clear_secrets(item, key=f"{key}.{name}")
|
|
231
|
+
elif isinstance(value, list):
|
|
232
|
+
for index, item in enumerate(value):
|
|
233
|
+
_reject_clear_secrets(item, key=f"{key}[{index}]")
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def _parse_cron(expression: str) -> tuple[str, str, str, str, str]:
|
|
237
|
+
fields = tuple(part for part in expression.split() if part)
|
|
238
|
+
if len(fields) != 5:
|
|
239
|
+
raise ValueError("cron expression must use exactly five fields")
|
|
240
|
+
for value in fields:
|
|
241
|
+
if not re.fullmatch(r"[0-9*/,-]+", value):
|
|
242
|
+
raise ValueError("cron fields only support numbers, ranges, lists and steps")
|
|
243
|
+
return fields # detailed field grammar is shared with calendar.py
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
__all__ = [
|
|
247
|
+
"ScheduleCommandTemplate",
|
|
248
|
+
"ScheduleOccurrence",
|
|
249
|
+
"ScheduleOccurrenceState",
|
|
250
|
+
"ScheduleOccurrenceTransition",
|
|
251
|
+
"ScheduleSpec",
|
|
252
|
+
"ScheduledTask",
|
|
253
|
+
"ScheduledTaskTarget",
|
|
254
|
+
]
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""Local Scheduler Lite's explicit AgentControl dispatcher."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
from collections.abc import Awaitable, Callable, Sequence
|
|
7
|
+
|
|
8
|
+
from ksadk.kernel.contracts import (
|
|
9
|
+
AgentControlCommand,
|
|
10
|
+
AgentControlPermit,
|
|
11
|
+
AgentControlReceipt,
|
|
12
|
+
)
|
|
13
|
+
from ksadk.kernel.ingress import (
|
|
14
|
+
map_scheduler_request,
|
|
15
|
+
submit_command,
|
|
16
|
+
subscribe_projected,
|
|
17
|
+
trusted_context,
|
|
18
|
+
)
|
|
19
|
+
from ksadk.scheduler.contracts import ScheduledTask, ScheduledTaskTarget, ScheduleOccurrence
|
|
20
|
+
from ksadk.scheduler.engine import SchedulerDispatchError, SchedulerDispatchReceipt
|
|
21
|
+
|
|
22
|
+
SubmitCommand = Callable[[AgentControlCommand, AgentControlPermit], Awaitable[AgentControlReceipt]]
|
|
23
|
+
ReadOccurrenceEvents = Callable[
|
|
24
|
+
[ScheduleOccurrence], Awaitable[Sequence[tuple[int, object]]]
|
|
25
|
+
]
|
|
26
|
+
PrepareTarget = Callable[[ScheduledTaskTarget], Awaitable[object]]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class AgentControlSchedulerDispatcher:
|
|
30
|
+
"""Translate one occurrence into a single durable AgentControl enqueue.
|
|
31
|
+
|
|
32
|
+
This dispatcher is intentionally local-runtime only. A hosted scheduler
|
|
33
|
+
must obtain a Server-issued permit at its admission boundary in Phase 3;
|
|
34
|
+
this class never makes local permits look valid against hosted JWKS.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(
|
|
38
|
+
self,
|
|
39
|
+
submitter: SubmitCommand | None = None,
|
|
40
|
+
*,
|
|
41
|
+
event_reader: ReadOccurrenceEvents | None = None,
|
|
42
|
+
target_preparer: PrepareTarget | None = None,
|
|
43
|
+
) -> None:
|
|
44
|
+
self._submitter = submitter or _submit_via_ingress
|
|
45
|
+
self._event_reader = event_reader
|
|
46
|
+
self._target_preparer = target_preparer
|
|
47
|
+
|
|
48
|
+
async def dispatch(
|
|
49
|
+
self, task: ScheduledTask, occurrence: ScheduleOccurrence
|
|
50
|
+
) -> SchedulerDispatchReceipt:
|
|
51
|
+
target = task.target
|
|
52
|
+
if self._target_preparer is not None:
|
|
53
|
+
await self._target_preparer(target)
|
|
54
|
+
trusted = trusted_context(
|
|
55
|
+
source_kind="scheduler",
|
|
56
|
+
source_ref=occurrence.occurrence_id,
|
|
57
|
+
tenant_id=target.tenant_id,
|
|
58
|
+
agent_instance_id=target.agent_instance_id,
|
|
59
|
+
session_id=occurrence.session_id,
|
|
60
|
+
operations=("enqueue",),
|
|
61
|
+
)
|
|
62
|
+
command = map_scheduler_request(
|
|
63
|
+
session_id=occurrence.session_id,
|
|
64
|
+
idempotency_key=occurrence.occurrence_id,
|
|
65
|
+
content=task.command.payload["content"],
|
|
66
|
+
occurrence_id=occurrence.occurrence_id,
|
|
67
|
+
trusted=trusted,
|
|
68
|
+
)
|
|
69
|
+
receipt = await self._submitter(command, trusted.permit)
|
|
70
|
+
if receipt.status not in {"accepted", "duplicate"}:
|
|
71
|
+
error = receipt.error
|
|
72
|
+
raise SchedulerDispatchError(
|
|
73
|
+
error.code if error else f"KERNEL_{receipt.status.upper()}",
|
|
74
|
+
error.message if error else f"kernel rejected occurrence: {receipt.status}",
|
|
75
|
+
)
|
|
76
|
+
return SchedulerDispatchReceipt(str(receipt.command_id), accepted_seq=receipt.accepted_seq)
|
|
77
|
+
|
|
78
|
+
async def read_events(self, occurrence: ScheduleOccurrence) -> tuple[tuple[int, object], ...]:
|
|
79
|
+
"""Read currently available canonical facts without holding an SSE open.
|
|
80
|
+
|
|
81
|
+
The local scheduler wakes frequently; each read resumes from the
|
|
82
|
+
durable session cursor persisted on the occurrence. This avoids a
|
|
83
|
+
hidden second event log and lets a Studio restart continue settling an
|
|
84
|
+
already-accepted run.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
if self._event_reader is not None:
|
|
88
|
+
return tuple(await self._event_reader(occurrence))
|
|
89
|
+
|
|
90
|
+
target = occurrence.target
|
|
91
|
+
if target is None:
|
|
92
|
+
return ()
|
|
93
|
+
trusted = trusted_context(
|
|
94
|
+
source_kind="scheduler",
|
|
95
|
+
source_ref=occurrence.occurrence_id,
|
|
96
|
+
tenant_id=target.tenant_id,
|
|
97
|
+
agent_instance_id=target.agent_instance_id,
|
|
98
|
+
session_id=occurrence.session_id,
|
|
99
|
+
operations=("subscribe_events",),
|
|
100
|
+
)
|
|
101
|
+
cursor = occurrence.last_event_seq
|
|
102
|
+
if cursor is None:
|
|
103
|
+
cursor = occurrence.accepted_seq or 0
|
|
104
|
+
stream = subscribe_projected(
|
|
105
|
+
occurrence.session_id,
|
|
106
|
+
trusted=trusted,
|
|
107
|
+
after_seq=cursor,
|
|
108
|
+
projector=lambda event: event,
|
|
109
|
+
)
|
|
110
|
+
events: list[tuple[int, object]] = []
|
|
111
|
+
try:
|
|
112
|
+
while len(events) < 100:
|
|
113
|
+
try:
|
|
114
|
+
value = await asyncio.wait_for(anext(stream), timeout=0.05)
|
|
115
|
+
except TimeoutError:
|
|
116
|
+
break
|
|
117
|
+
events.append(value)
|
|
118
|
+
finally:
|
|
119
|
+
await stream.aclose()
|
|
120
|
+
return tuple(events)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
async def _submit_via_ingress(
|
|
124
|
+
command: AgentControlCommand, permit: AgentControlPermit
|
|
125
|
+
) -> AgentControlReceipt:
|
|
126
|
+
return await submit_command(command, permit=permit)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
__all__ = ["AgentControlSchedulerDispatcher"]
|