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,659 @@
|
|
|
1
|
+
"""Restricted Codex App Server plugin lifecycle bridge.
|
|
2
|
+
|
|
3
|
+
Codex remains the native owner of Codex plugins. KsADK only calls the
|
|
4
|
+
allowlisted App Server lifecycle methods and projects their inventory into
|
|
5
|
+
strict local models. There is intentionally no arbitrary JSON-RPC escape
|
|
6
|
+
hatch and no attempt to execute a Codex plugin inside PluginHost.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import asyncio
|
|
12
|
+
import re
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Literal, Protocol, TypeVar, cast
|
|
15
|
+
|
|
16
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _to_camel(value: str) -> str:
|
|
20
|
+
head, *tail = value.split("_")
|
|
21
|
+
return head + "".join(part.capitalize() for part in tail)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class _CodexPublicModel(BaseModel):
|
|
25
|
+
model_config = ConfigDict(
|
|
26
|
+
alias_generator=_to_camel,
|
|
27
|
+
populate_by_name=True,
|
|
28
|
+
extra="forbid",
|
|
29
|
+
frozen=True,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class _CodexWireModel(_CodexPublicModel):
|
|
34
|
+
"""Forward-compatible model for the experimental App Server surface."""
|
|
35
|
+
|
|
36
|
+
model_config = ConfigDict(
|
|
37
|
+
alias_generator=_to_camel,
|
|
38
|
+
populate_by_name=True,
|
|
39
|
+
extra="allow",
|
|
40
|
+
frozen=True,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class _LocalSource(_CodexWireModel):
|
|
45
|
+
type: Literal["local"]
|
|
46
|
+
path: str
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class _GitSource(_CodexWireModel):
|
|
50
|
+
type: Literal["git"]
|
|
51
|
+
url: str
|
|
52
|
+
ref_name: str | None = None
|
|
53
|
+
sha: str | None = None
|
|
54
|
+
path: str | None = None
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class _NpmSource(_CodexWireModel):
|
|
58
|
+
type: Literal["npm"]
|
|
59
|
+
package: str
|
|
60
|
+
version: str | None = None
|
|
61
|
+
registry: str | None = None
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class _RemoteSource(_CodexWireModel):
|
|
65
|
+
type: Literal["remote"]
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
CodexPluginSource = _LocalSource | _GitSource | _NpmSource | _RemoteSource
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class _PluginSummary(_CodexWireModel):
|
|
72
|
+
id: str
|
|
73
|
+
name: str
|
|
74
|
+
source: CodexPluginSource = Field(discriminator="type")
|
|
75
|
+
installed: bool
|
|
76
|
+
enabled: bool
|
|
77
|
+
install_policy: Literal["NOT_AVAILABLE", "AVAILABLE", "INSTALLED_BY_DEFAULT"]
|
|
78
|
+
auth_policy: Literal["ON_INSTALL", "ON_USE"]
|
|
79
|
+
remote_plugin_id: str | None = None
|
|
80
|
+
version: str | None = None
|
|
81
|
+
local_version: str | None = None
|
|
82
|
+
installed_at: int | None = None
|
|
83
|
+
install_policy_source: str | None = None
|
|
84
|
+
must_show_installation_interstitial: bool | None = None
|
|
85
|
+
availability: str = "AVAILABLE"
|
|
86
|
+
disabled_reason: str | None = None
|
|
87
|
+
eligible_plan_types: tuple[str, ...] | None = None
|
|
88
|
+
share_context: dict[str, Any] | None = None
|
|
89
|
+
interface: dict[str, Any] | None = None
|
|
90
|
+
keywords: tuple[str, ...] = ()
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class _Marketplace(_CodexWireModel):
|
|
94
|
+
name: str
|
|
95
|
+
path: str | None = None
|
|
96
|
+
interface: dict[str, Any] | None = None
|
|
97
|
+
plugins: tuple[_PluginSummary, ...]
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class _MarketplaceLoadError(_CodexWireModel):
|
|
101
|
+
marketplace_path: str
|
|
102
|
+
message: str
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class _PluginListResponse(_CodexWireModel):
|
|
106
|
+
marketplaces: tuple[_Marketplace, ...]
|
|
107
|
+
marketplace_load_errors: tuple[_MarketplaceLoadError, ...] = ()
|
|
108
|
+
featured_plugin_ids: tuple[str, ...] = ()
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class _PluginDetailWire(_CodexWireModel):
|
|
112
|
+
marketplace_name: str
|
|
113
|
+
marketplace_path: str | None
|
|
114
|
+
summary: _PluginSummary
|
|
115
|
+
description: str | None = None
|
|
116
|
+
share_url: str | None = None
|
|
117
|
+
skills: tuple[dict[str, Any], ...]
|
|
118
|
+
hooks: tuple[dict[str, Any], ...]
|
|
119
|
+
apps: tuple[dict[str, Any], ...]
|
|
120
|
+
app_templates: tuple[dict[str, Any], ...]
|
|
121
|
+
mcp_servers: tuple[str, ...]
|
|
122
|
+
scheduled_tasks: tuple[dict[str, Any], ...] | None = None
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class _PluginReadResponse(_CodexWireModel):
|
|
126
|
+
plugin: _PluginDetailWire
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class _MarketplaceAddResponse(_CodexWireModel):
|
|
130
|
+
marketplace_name: str
|
|
131
|
+
installed_root: str
|
|
132
|
+
already_added: bool
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class _PluginInstallResponse(_CodexWireModel):
|
|
136
|
+
auth_policy: Literal["ON_INSTALL", "ON_USE"]
|
|
137
|
+
apps_needing_auth: tuple[dict[str, Any], ...]
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class _PluginUninstallResponse(_CodexWireModel):
|
|
141
|
+
pass
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
class CodexPluginInventory(_CodexPublicModel):
|
|
145
|
+
"""Normalized observed state; install receipt never implies these fields."""
|
|
146
|
+
|
|
147
|
+
plugin_id: str
|
|
148
|
+
name: str
|
|
149
|
+
marketplace_name: str
|
|
150
|
+
marketplace_path: str | None
|
|
151
|
+
version: str | None
|
|
152
|
+
installed: bool
|
|
153
|
+
enabled: bool
|
|
154
|
+
availability: str
|
|
155
|
+
source: CodexPluginSource = Field(discriminator="type")
|
|
156
|
+
interface: dict[str, Any] = Field(default_factory=dict)
|
|
157
|
+
permissions_declared: Literal[False] = False
|
|
158
|
+
risk_disclosures: tuple[str, ...] = (
|
|
159
|
+
"Codex plugin permissions are host-managed and not declared in the plugin manifest.",
|
|
160
|
+
"The Codex App Server and installed plugin run with the current host user privileges.",
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class CodexHostComponentDetail(_CodexPublicModel):
|
|
165
|
+
"""Lossless-enough projection of a component reported by ``plugin/read``."""
|
|
166
|
+
|
|
167
|
+
kind: Literal["skill", "mcp", "hook", "app", "app-template", "scheduled-task"]
|
|
168
|
+
name: str
|
|
169
|
+
path: str | None = None
|
|
170
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class CodexPluginDetail(_CodexPublicModel):
|
|
174
|
+
inventory: CodexPluginInventory
|
|
175
|
+
description: str | None = None
|
|
176
|
+
share_url: str | None = None
|
|
177
|
+
skills: tuple[str, ...] = ()
|
|
178
|
+
mcp_servers: tuple[str, ...] = ()
|
|
179
|
+
hooks: tuple[str, ...] = ()
|
|
180
|
+
apps: tuple[str, ...] = ()
|
|
181
|
+
scheduled_tasks: tuple[str, ...] = ()
|
|
182
|
+
components: tuple[CodexHostComponentDetail, ...] = ()
|
|
183
|
+
host_metadata: dict[str, Any] = Field(default_factory=dict)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class CodexMarketplaceAddResult(_CodexPublicModel):
|
|
187
|
+
marketplace_name: str
|
|
188
|
+
installed_root: str
|
|
189
|
+
already_added: bool
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class CodexPluginInstallResult(_CodexPublicModel):
|
|
193
|
+
inventory: CodexPluginInventory
|
|
194
|
+
auth_policy: Literal["ON_INSTALL", "ON_USE"]
|
|
195
|
+
apps_needing_auth: tuple[str, ...] = ()
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
class CodexPluginUninstallResult(_CodexPublicModel):
|
|
199
|
+
plugin_id: str
|
|
200
|
+
installed: Literal[False] = False
|
|
201
|
+
enabled: Literal[False] = False
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class CodexBridgeHost(_CodexPublicModel):
|
|
205
|
+
host_id: Literal["codex-app-server"] = "codex-app-server"
|
|
206
|
+
version: str
|
|
207
|
+
protocol: Literal["codex.app-server/v1"] = "codex.app-server/v1"
|
|
208
|
+
available: Literal[True] = True
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
class CodexBridgeError(RuntimeError):
|
|
212
|
+
"""Base error for a bounded Codex plugin lifecycle operation."""
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
class CodexPluginNotFoundError(CodexBridgeError):
|
|
216
|
+
pass
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
class CodexPluginApprovalRequired(CodexBridgeError):
|
|
220
|
+
pass
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
ResponseT = TypeVar("ResponseT", bound=BaseModel)
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class _CodexTransport(Protocol):
|
|
227
|
+
async def start(self) -> None: ...
|
|
228
|
+
|
|
229
|
+
async def close(self) -> None: ...
|
|
230
|
+
|
|
231
|
+
async def initialize(self) -> Any: ...
|
|
232
|
+
|
|
233
|
+
async def request(
|
|
234
|
+
self,
|
|
235
|
+
method: str,
|
|
236
|
+
params: dict[str, Any] | None,
|
|
237
|
+
*,
|
|
238
|
+
response_model: type[ResponseT],
|
|
239
|
+
) -> ResponseT: ...
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
_HOST_VERSION = re.compile(r"(?:Codex(?: Desktop)?/)(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)")
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def _reported_host_version(metadata: Any) -> str:
|
|
246
|
+
"""Return an App Server version without making its user-agent a gate.
|
|
247
|
+
|
|
248
|
+
App Server exposes plugin lifecycle methods as the compatibility contract.
|
|
249
|
+
Its ``userAgent`` field is diagnostic metadata and has changed shape across
|
|
250
|
+
CLI, Desktop, and SDK launches. A missing or unfamiliar value must remain
|
|
251
|
+
visible to callers, but must not prevent an otherwise compatible host from
|
|
252
|
+
listing, installing, or removing a plugin.
|
|
253
|
+
"""
|
|
254
|
+
raw = getattr(metadata, "user_agent", None) or getattr(metadata, "userAgent", None)
|
|
255
|
+
if raw is None and isinstance(metadata, dict):
|
|
256
|
+
raw = metadata.get("userAgent") or metadata.get("user_agent")
|
|
257
|
+
if raw is None and isinstance(metadata, BaseModel):
|
|
258
|
+
payload = metadata.model_dump(by_alias=True)
|
|
259
|
+
raw = payload.get("userAgent") or payload.get("user_agent")
|
|
260
|
+
match = _HOST_VERSION.search(str(raw or ""))
|
|
261
|
+
return match.group(1) if match is not None else "unreported"
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def _component_path(metadata: dict[str, Any]) -> str | None:
|
|
265
|
+
for field in (
|
|
266
|
+
"path",
|
|
267
|
+
"filePath",
|
|
268
|
+
"file_path",
|
|
269
|
+
"skillPath",
|
|
270
|
+
"skill_path",
|
|
271
|
+
"manifestPath",
|
|
272
|
+
"manifest_path",
|
|
273
|
+
):
|
|
274
|
+
value = metadata.get(field)
|
|
275
|
+
if isinstance(value, str) and value:
|
|
276
|
+
return value
|
|
277
|
+
return None
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def _reported_components(plugin: _PluginDetailWire) -> tuple[CodexHostComponentDetail, ...]:
|
|
281
|
+
components: list[CodexHostComponentDetail] = []
|
|
282
|
+
|
|
283
|
+
def append(
|
|
284
|
+
kind: Literal["skill", "hook", "app", "app-template", "scheduled-task"],
|
|
285
|
+
items: tuple[dict[str, Any], ...],
|
|
286
|
+
identity_fields: tuple[str, ...],
|
|
287
|
+
) -> None:
|
|
288
|
+
for index, item in enumerate(items):
|
|
289
|
+
name = next(
|
|
290
|
+
(
|
|
291
|
+
str(item[field])
|
|
292
|
+
for field in identity_fields
|
|
293
|
+
if item.get(field) not in (None, "")
|
|
294
|
+
),
|
|
295
|
+
f"{kind}:{index}",
|
|
296
|
+
)
|
|
297
|
+
components.append(
|
|
298
|
+
CodexHostComponentDetail(
|
|
299
|
+
kind=kind,
|
|
300
|
+
name=name,
|
|
301
|
+
path=_component_path(item),
|
|
302
|
+
metadata=dict(item),
|
|
303
|
+
)
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
append("skill", plugin.skills, ("name", "id", "key"))
|
|
307
|
+
append("hook", plugin.hooks, ("key", "name", "id"))
|
|
308
|
+
append("app", plugin.apps, ("id", "name", "key"))
|
|
309
|
+
append("app-template", plugin.app_templates, ("id", "name", "key"))
|
|
310
|
+
append(
|
|
311
|
+
"scheduled-task",
|
|
312
|
+
plugin.scheduled_tasks or (),
|
|
313
|
+
("key", "name", "id"),
|
|
314
|
+
)
|
|
315
|
+
components.extend(
|
|
316
|
+
CodexHostComponentDetail(kind="mcp", name=name) for name in plugin.mcp_servers
|
|
317
|
+
)
|
|
318
|
+
return tuple(components)
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
class CodexAppServerPluginBridge:
|
|
322
|
+
"""Allowlisted Codex plugin manager backed by one App Server process."""
|
|
323
|
+
|
|
324
|
+
def __init__(
|
|
325
|
+
self,
|
|
326
|
+
*,
|
|
327
|
+
codex_home: Path | None = None,
|
|
328
|
+
codex_bin: str | None = None,
|
|
329
|
+
transport: _CodexTransport | None = None,
|
|
330
|
+
) -> None:
|
|
331
|
+
if transport is not None and (codex_home is not None or codex_bin is not None):
|
|
332
|
+
raise ValueError("an injected transport cannot be combined with Codex launch options")
|
|
333
|
+
self._codex_home = codex_home
|
|
334
|
+
self._codex_bin = codex_bin
|
|
335
|
+
self._transport = transport
|
|
336
|
+
self._owns_transport = transport is None
|
|
337
|
+
self._started = False
|
|
338
|
+
self._host: CodexBridgeHost | None = None
|
|
339
|
+
self._lock = asyncio.Lock()
|
|
340
|
+
|
|
341
|
+
async def __aenter__(self) -> "CodexAppServerPluginBridge":
|
|
342
|
+
await self.start()
|
|
343
|
+
return self
|
|
344
|
+
|
|
345
|
+
async def __aexit__(self, _exc_type: object, _exc: object, _tb: object) -> None:
|
|
346
|
+
await self.close()
|
|
347
|
+
|
|
348
|
+
@property
|
|
349
|
+
def host(self) -> CodexBridgeHost:
|
|
350
|
+
if self._host is None:
|
|
351
|
+
raise CodexBridgeError("Codex App Server bridge is not started")
|
|
352
|
+
return self._host
|
|
353
|
+
|
|
354
|
+
async def start(self) -> CodexBridgeHost:
|
|
355
|
+
if self._started:
|
|
356
|
+
return self.host
|
|
357
|
+
if self._codex_home is not None:
|
|
358
|
+
self._codex_home.mkdir(parents=True, exist_ok=True)
|
|
359
|
+
if self._transport is None:
|
|
360
|
+
self._transport = self._create_transport()
|
|
361
|
+
try:
|
|
362
|
+
await self._transport.start()
|
|
363
|
+
metadata = await self._transport.initialize()
|
|
364
|
+
self._host = CodexBridgeHost(version=_reported_host_version(metadata))
|
|
365
|
+
self._started = True
|
|
366
|
+
return self._host
|
|
367
|
+
except BaseException:
|
|
368
|
+
await self.close()
|
|
369
|
+
raise
|
|
370
|
+
|
|
371
|
+
async def close(self) -> None:
|
|
372
|
+
transport = self._transport
|
|
373
|
+
self._transport = None if self._owns_transport else transport
|
|
374
|
+
self._started = False
|
|
375
|
+
self._host = None
|
|
376
|
+
if transport is not None:
|
|
377
|
+
await transport.close()
|
|
378
|
+
|
|
379
|
+
async def add_marketplace(self, source: str, *, ref_name: str | None = None) -> str:
|
|
380
|
+
result = await self.add_marketplace_with_receipt(source, ref_name=ref_name)
|
|
381
|
+
return result.marketplace_name
|
|
382
|
+
|
|
383
|
+
async def add_marketplace_with_receipt(
|
|
384
|
+
self,
|
|
385
|
+
source: str,
|
|
386
|
+
*,
|
|
387
|
+
ref_name: str | None = None,
|
|
388
|
+
) -> CodexMarketplaceAddResult:
|
|
389
|
+
"""Add a marketplace while retaining its host-materialized root."""
|
|
390
|
+
|
|
391
|
+
response = await self._request(
|
|
392
|
+
"marketplace/add",
|
|
393
|
+
{"source": source, "refName": ref_name, "sparsePaths": None},
|
|
394
|
+
_MarketplaceAddResponse,
|
|
395
|
+
)
|
|
396
|
+
return CodexMarketplaceAddResult(
|
|
397
|
+
marketplace_name=response.marketplace_name,
|
|
398
|
+
installed_root=response.installed_root,
|
|
399
|
+
already_added=response.already_added,
|
|
400
|
+
)
|
|
401
|
+
|
|
402
|
+
async def list_plugins(
|
|
403
|
+
self, *, force_refetch: bool = False
|
|
404
|
+
) -> tuple[CodexPluginInventory, ...]:
|
|
405
|
+
response = await self._list_wire(force_refetch=force_refetch)
|
|
406
|
+
return tuple(
|
|
407
|
+
self._inventory(marketplace, summary)
|
|
408
|
+
for marketplace in response.marketplaces
|
|
409
|
+
for summary in marketplace.plugins
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
async def read_plugin(
|
|
413
|
+
self,
|
|
414
|
+
plugin_name_or_id: str,
|
|
415
|
+
*,
|
|
416
|
+
marketplace_name: str | None = None,
|
|
417
|
+
) -> CodexPluginDetail:
|
|
418
|
+
marketplace, summary = await self._resolve(plugin_name_or_id, marketplace_name)
|
|
419
|
+
response = await self._request(
|
|
420
|
+
"plugin/read",
|
|
421
|
+
{
|
|
422
|
+
"pluginName": summary.name,
|
|
423
|
+
"marketplacePath": marketplace.path,
|
|
424
|
+
"remoteMarketplaceName": None if marketplace.path else marketplace.name,
|
|
425
|
+
},
|
|
426
|
+
_PluginReadResponse,
|
|
427
|
+
)
|
|
428
|
+
plugin = response.plugin
|
|
429
|
+
components = _reported_components(plugin)
|
|
430
|
+
return CodexPluginDetail(
|
|
431
|
+
inventory=self._inventory(marketplace, plugin.summary),
|
|
432
|
+
description=plugin.description,
|
|
433
|
+
share_url=plugin.share_url,
|
|
434
|
+
skills=tuple(component.name for component in components if component.kind == "skill"),
|
|
435
|
+
mcp_servers=plugin.mcp_servers,
|
|
436
|
+
hooks=tuple(component.name for component in components if component.kind == "hook"),
|
|
437
|
+
apps=tuple(component.name for component in components if component.kind == "app"),
|
|
438
|
+
scheduled_tasks=tuple(
|
|
439
|
+
component.name for component in components if component.kind == "scheduled-task"
|
|
440
|
+
),
|
|
441
|
+
components=components,
|
|
442
|
+
host_metadata=dict(plugin.model_extra or {}),
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
async def install_plugin(
|
|
446
|
+
self,
|
|
447
|
+
plugin_name_or_id: str,
|
|
448
|
+
*,
|
|
449
|
+
marketplace_name: str | None = None,
|
|
450
|
+
accept_undeclared_permissions: bool = False,
|
|
451
|
+
install_attempt_id: str | None = None,
|
|
452
|
+
) -> CodexPluginInstallResult:
|
|
453
|
+
if not accept_undeclared_permissions:
|
|
454
|
+
raise CodexPluginApprovalRequired(
|
|
455
|
+
"Codex plugins do not expose complete install/runtime permissions; "
|
|
456
|
+
"explicit accept_undeclared_permissions=True is required"
|
|
457
|
+
)
|
|
458
|
+
async with self._lock:
|
|
459
|
+
marketplace, summary = await self._resolve(plugin_name_or_id, marketplace_name)
|
|
460
|
+
before = self._inventory(marketplace, summary)
|
|
461
|
+
try:
|
|
462
|
+
response = await self._request(
|
|
463
|
+
"plugin/install",
|
|
464
|
+
{
|
|
465
|
+
"pluginName": summary.name,
|
|
466
|
+
"marketplacePath": marketplace.path,
|
|
467
|
+
"remoteMarketplaceName": None if marketplace.path else marketplace.name,
|
|
468
|
+
"installAttemptId": install_attempt_id,
|
|
469
|
+
},
|
|
470
|
+
_PluginInstallResponse,
|
|
471
|
+
)
|
|
472
|
+
observed = await self._resolve_inventory(
|
|
473
|
+
summary.id,
|
|
474
|
+
marketplace.name,
|
|
475
|
+
force_refetch=True,
|
|
476
|
+
)
|
|
477
|
+
if not observed.installed or not observed.enabled:
|
|
478
|
+
raise CodexBridgeError(
|
|
479
|
+
"Codex host did not reconcile the installed plugin as enabled"
|
|
480
|
+
)
|
|
481
|
+
except BaseException as install_error:
|
|
482
|
+
try:
|
|
483
|
+
restored = await asyncio.shield(self._restore_failed_install(before))
|
|
484
|
+
except BaseException as rollback_error:
|
|
485
|
+
raise CodexBridgeError(
|
|
486
|
+
"Codex plugin install failed and its previous inventory "
|
|
487
|
+
"could not be restored"
|
|
488
|
+
) from rollback_error
|
|
489
|
+
raise CodexBridgeError(
|
|
490
|
+
"Codex plugin install failed; previous inventory was restored "
|
|
491
|
+
f"(installed={restored.installed}, enabled={restored.enabled})"
|
|
492
|
+
) from install_error
|
|
493
|
+
return CodexPluginInstallResult(
|
|
494
|
+
inventory=observed,
|
|
495
|
+
auth_policy=response.auth_policy,
|
|
496
|
+
apps_needing_auth=tuple(
|
|
497
|
+
str(item.get("id", "")) for item in response.apps_needing_auth if item.get("id")
|
|
498
|
+
),
|
|
499
|
+
)
|
|
500
|
+
|
|
501
|
+
async def uninstall_plugin(self, plugin_id: str) -> CodexPluginUninstallResult:
|
|
502
|
+
async with self._lock:
|
|
503
|
+
marketplace, summary = await self._resolve(plugin_id, None)
|
|
504
|
+
await self._request(
|
|
505
|
+
"plugin/uninstall",
|
|
506
|
+
{"pluginId": summary.id},
|
|
507
|
+
_PluginUninstallResponse,
|
|
508
|
+
)
|
|
509
|
+
observed = await self._resolve_inventory(summary.id, marketplace.name)
|
|
510
|
+
if observed.installed or observed.enabled:
|
|
511
|
+
raise CodexBridgeError("Codex host still reports the uninstalled plugin as active")
|
|
512
|
+
return CodexPluginUninstallResult(plugin_id=summary.id)
|
|
513
|
+
|
|
514
|
+
def _create_transport(self) -> _CodexTransport:
|
|
515
|
+
try:
|
|
516
|
+
from openai_codex.async_client import AsyncCodexClient
|
|
517
|
+
from openai_codex.client import CodexConfig
|
|
518
|
+
except ImportError as exc: # pragma: no cover - depends on optional extra
|
|
519
|
+
raise CodexBridgeError("Codex plugin bridge requires the ksadk[codex] extra") from exc
|
|
520
|
+
env = None
|
|
521
|
+
if self._codex_home is not None:
|
|
522
|
+
env = {"CODEX_HOME": str(self._codex_home.resolve())}
|
|
523
|
+
return cast(
|
|
524
|
+
_CodexTransport,
|
|
525
|
+
AsyncCodexClient(CodexConfig(codex_bin=self._codex_bin, env=env)),
|
|
526
|
+
)
|
|
527
|
+
|
|
528
|
+
async def _request(
|
|
529
|
+
self,
|
|
530
|
+
method: Literal[
|
|
531
|
+
"marketplace/add",
|
|
532
|
+
"plugin/list",
|
|
533
|
+
"plugin/read",
|
|
534
|
+
"plugin/install",
|
|
535
|
+
"plugin/uninstall",
|
|
536
|
+
],
|
|
537
|
+
params: dict[str, Any] | None,
|
|
538
|
+
response_model: type[ResponseT],
|
|
539
|
+
) -> ResponseT:
|
|
540
|
+
if not self._started or self._transport is None:
|
|
541
|
+
raise CodexBridgeError("Codex App Server bridge is not started")
|
|
542
|
+
return await self._transport.request(method, params, response_model=response_model)
|
|
543
|
+
|
|
544
|
+
async def _list_wire(self, *, force_refetch: bool = False) -> _PluginListResponse:
|
|
545
|
+
return await self._request(
|
|
546
|
+
"plugin/list",
|
|
547
|
+
{"forceRefetch": force_refetch, "cwds": None, "marketplaceKinds": None},
|
|
548
|
+
_PluginListResponse,
|
|
549
|
+
)
|
|
550
|
+
|
|
551
|
+
async def _resolve(
|
|
552
|
+
self,
|
|
553
|
+
plugin_name_or_id: str,
|
|
554
|
+
marketplace_name: str | None,
|
|
555
|
+
*,
|
|
556
|
+
force_refetch: bool = False,
|
|
557
|
+
) -> tuple[_Marketplace, _PluginSummary]:
|
|
558
|
+
response = await self._list_wire(force_refetch=force_refetch)
|
|
559
|
+
matches = [
|
|
560
|
+
(marketplace, summary)
|
|
561
|
+
for marketplace in response.marketplaces
|
|
562
|
+
if marketplace_name is None or marketplace.name == marketplace_name
|
|
563
|
+
for summary in marketplace.plugins
|
|
564
|
+
if summary.id == plugin_name_or_id or summary.name == plugin_name_or_id
|
|
565
|
+
]
|
|
566
|
+
if len(matches) != 1:
|
|
567
|
+
qualifier = f" in marketplace {marketplace_name!r}" if marketplace_name else ""
|
|
568
|
+
if not matches:
|
|
569
|
+
raise CodexPluginNotFoundError(
|
|
570
|
+
f"Codex plugin {plugin_name_or_id!r}{qualifier} was not found"
|
|
571
|
+
)
|
|
572
|
+
raise CodexBridgeError(
|
|
573
|
+
f"Codex plugin name {plugin_name_or_id!r} is ambiguous; use its full plugin id"
|
|
574
|
+
)
|
|
575
|
+
return matches[0]
|
|
576
|
+
|
|
577
|
+
async def _resolve_inventory(
|
|
578
|
+
self,
|
|
579
|
+
plugin_id: str,
|
|
580
|
+
marketplace_name: str,
|
|
581
|
+
*,
|
|
582
|
+
force_refetch: bool = False,
|
|
583
|
+
) -> CodexPluginInventory:
|
|
584
|
+
marketplace, summary = await self._resolve(
|
|
585
|
+
plugin_id,
|
|
586
|
+
marketplace_name,
|
|
587
|
+
force_refetch=force_refetch,
|
|
588
|
+
)
|
|
589
|
+
return self._inventory(marketplace, summary)
|
|
590
|
+
|
|
591
|
+
async def _restore_failed_install(
|
|
592
|
+
self,
|
|
593
|
+
before: CodexPluginInventory,
|
|
594
|
+
) -> CodexPluginInventory:
|
|
595
|
+
"""Compensate an install whose receipt/reconciliation failed.
|
|
596
|
+
|
|
597
|
+
App Server may have committed files before its response is lost. For
|
|
598
|
+
the only state transition exposed by ``install_plugin`` (available ->
|
|
599
|
+
installed), uninstall is the native compensating action. An already
|
|
600
|
+
installed plugin is never silently reinstalled because the App Server
|
|
601
|
+
API cannot pin its previous local bytes; any observed drift therefore
|
|
602
|
+
fails closed rather than claiming rollback.
|
|
603
|
+
"""
|
|
604
|
+
|
|
605
|
+
observed = await self._resolve_inventory(
|
|
606
|
+
before.plugin_id,
|
|
607
|
+
before.marketplace_name,
|
|
608
|
+
force_refetch=True,
|
|
609
|
+
)
|
|
610
|
+
if not before.installed and observed.installed:
|
|
611
|
+
await self._request(
|
|
612
|
+
"plugin/uninstall",
|
|
613
|
+
{"pluginId": before.plugin_id},
|
|
614
|
+
_PluginUninstallResponse,
|
|
615
|
+
)
|
|
616
|
+
observed = await self._resolve_inventory(
|
|
617
|
+
before.plugin_id,
|
|
618
|
+
before.marketplace_name,
|
|
619
|
+
force_refetch=True,
|
|
620
|
+
)
|
|
621
|
+
if (observed.installed, observed.enabled) != (
|
|
622
|
+
before.installed,
|
|
623
|
+
before.enabled,
|
|
624
|
+
):
|
|
625
|
+
raise CodexBridgeError("Codex host inventory differs from the pre-install snapshot")
|
|
626
|
+
return observed
|
|
627
|
+
|
|
628
|
+
@staticmethod
|
|
629
|
+
def _inventory(
|
|
630
|
+
marketplace: _Marketplace,
|
|
631
|
+
summary: _PluginSummary,
|
|
632
|
+
) -> CodexPluginInventory:
|
|
633
|
+
return CodexPluginInventory(
|
|
634
|
+
plugin_id=summary.id,
|
|
635
|
+
name=summary.name,
|
|
636
|
+
marketplace_name=marketplace.name,
|
|
637
|
+
marketplace_path=marketplace.path,
|
|
638
|
+
version=summary.local_version or summary.version,
|
|
639
|
+
installed=summary.installed,
|
|
640
|
+
enabled=summary.enabled,
|
|
641
|
+
availability=summary.availability,
|
|
642
|
+
source=summary.source,
|
|
643
|
+
interface=summary.interface or {},
|
|
644
|
+
)
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
__all__ = [
|
|
648
|
+
"CodexAppServerPluginBridge",
|
|
649
|
+
"CodexBridgeError",
|
|
650
|
+
"CodexBridgeHost",
|
|
651
|
+
"CodexHostComponentDetail",
|
|
652
|
+
"CodexMarketplaceAddResult",
|
|
653
|
+
"CodexPluginApprovalRequired",
|
|
654
|
+
"CodexPluginDetail",
|
|
655
|
+
"CodexPluginInstallResult",
|
|
656
|
+
"CodexPluginInventory",
|
|
657
|
+
"CodexPluginNotFoundError",
|
|
658
|
+
"CodexPluginUninstallResult",
|
|
659
|
+
]
|