agentengine-sdk-python 0.8.3__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.
Files changed (509) hide show
  1. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/METADATA +9 -8
  2. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/RECORD +482 -245
  3. ksadk/_build_provenance.json +1 -1
  4. ksadk/api/client.py +105 -91
  5. ksadk/builders/code_builder.py +36 -9
  6. ksadk/builders/framework_requirements.py +2 -1
  7. ksadk/builders/ks3_uploader.py +36 -7
  8. ksadk/builders/managed_runtime_builder.py +1 -0
  9. ksadk/cli/__init__.py +32 -3
  10. ksadk/cli/cmd_managed_runtime.py +13 -1
  11. ksadk/cli/cmd_plugin.py +6 -1
  12. ksadk/cli/cmd_web.py +2 -5
  13. ksadk/cli/runtime_bootstrap.py +23 -1
  14. ksadk/codex/client.py +424 -96
  15. ksadk/codex/projection.py +24 -0
  16. ksadk/codex/runtime.py +56 -298
  17. ksadk/common/auth.py +16 -10
  18. ksadk/configs/env_registry.py +29 -1
  19. ksadk/conversations/message_projection.py +135 -14
  20. ksadk/conversations/projector.py +4 -6
  21. ksadk/conversations/runtime_invocation.py +5 -0
  22. ksadk/conversations/runtime_payloads.py +1 -0
  23. ksadk/conversations/runtime_preparation.py +30 -27
  24. ksadk/conversations/runtime_resume.py +50 -2
  25. ksadk/conversations/runtime_stream_events.py +5 -0
  26. ksadk/conversations/runtime_streaming.py +25 -7
  27. ksadk/deployment/env_forward.py +2 -2
  28. ksadk/deployment/providers/serverless.py +1 -1
  29. ksadk/events/adapters/_codex_validators.py +18 -7
  30. ksadk/events/adapters/langgraph.py +15 -1
  31. ksadk/events/canonical_store.py +3 -1
  32. ksadk/events/projections.py +1 -1
  33. ksadk/harness/config.py +2 -2
  34. ksadk/harness/runtime.py +27 -27
  35. ksadk/harness/tools.py +38 -13
  36. ksadk/interaction/provider.py +1 -0
  37. ksadk/interaction/providers/langgraph.py +1 -0
  38. ksadk/kernel/bootstrap.py +28 -4
  39. ksadk/kernel/ingress.py +15 -2
  40. ksadk/kernel/sqlite_store.py +27 -0
  41. ksadk/kernel/store.py +3 -0
  42. ksadk/kernel/worker.py +65 -10
  43. ksadk/knowledge_base/client.py +57 -27
  44. ksadk/mcp_runtime/__init__.py +12 -4
  45. ksadk/memory/adk/backends/sdk_ltm_backend.py +161 -41
  46. ksadk/memory/adk/resilient_session_service.py +25 -17
  47. ksadk/memory/adk/short_term_memory.py +26 -9
  48. ksadk/memory/models.py +7 -4
  49. ksadk/memory/provider_resolver.py +3 -0
  50. ksadk/model_proxy/server.py +10 -5
  51. ksadk/plugins/__init__.py +4 -0
  52. ksadk/plugins/artifacts.py +275 -0
  53. ksadk/plugins/bridges/__init__.py +4 -2
  54. ksadk/plugins/bridges/codex.py +120 -13
  55. ksadk/plugins/bridges/dsh.py +340 -156
  56. ksadk/plugins/builtins.py +35 -36
  57. ksadk/plugins/bundle_security.py +28 -4
  58. ksadk/plugins/codex_manifest.py +983 -0
  59. ksadk/plugins/composition.py +8 -0
  60. ksadk/plugins/contracts.py +118 -0
  61. ksadk/plugins/delivery.py +153 -0
  62. ksadk/plugins/dsh_installation_digest.py +71 -0
  63. ksadk/plugins/dsh_toolchain.py +110 -21
  64. ksadk/plugins/ecosystem_probe.py +6 -6
  65. ksadk/plugins/host.py +102 -39
  66. ksadk/plugins/kernel_adapter.py +205 -0
  67. ksadk/plugins/providers/__init__.py +23 -0
  68. ksadk/plugins/providers/bundles/dsh-knowledge/cordis.patch.yml +3 -0
  69. ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +53 -0
  70. ksadk/plugins/providers/bundles/dsh-knowledge/package.json +16 -0
  71. ksadk/plugins/providers/bundles/dsh-memory/cordis.patch.yml +3 -0
  72. ksadk/plugins/providers/bundles/dsh-memory/index.mjs +175 -0
  73. ksadk/plugins/providers/bundles/dsh-memory/package.json +16 -0
  74. ksadk/plugins/providers/bundles/dsh-platform-resources/client.mjs +166 -0
  75. ksadk/plugins/providers/bundles/dsh-platform-resources/cordis.patch.yml +3 -0
  76. ksadk/plugins/providers/bundles/dsh-platform-resources/index.mjs +9 -0
  77. ksadk/plugins/providers/bundles/dsh-platform-resources/package.json +12 -0
  78. ksadk/plugins/providers/bundles/dsh-skill-center/cordis.patch.yml +3 -0
  79. ksadk/plugins/providers/bundles/dsh-skill-center/index.mjs +125 -0
  80. ksadk/plugins/providers/bundles/dsh-skill-center/package.json +16 -0
  81. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/cordis.patch.yml +3 -0
  82. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +870 -0
  83. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
  84. ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +92 -0
  85. ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +15 -0
  86. ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
  87. ksadk/plugins/providers/codex.py +335 -69
  88. ksadk/plugins/providers/codex_native.py +368 -0
  89. ksadk/plugins/providers/codex_turn.py +301 -0
  90. ksadk/plugins/providers/dsh_capabilities.py +1389 -0
  91. ksadk/plugins/providers/dsh_mcp.py +467 -0
  92. ksadk/plugins/providers/harness.py +118 -113
  93. ksadk/plugins/providers/mcp_projection.py +150 -0
  94. ksadk/plugins/providers/platform_resources.py +657 -0
  95. ksadk/plugins/resolver.py +8 -1
  96. ksadk/resource_runtime/__init__.py +4 -0
  97. ksadk/resource_runtime/broker.py +616 -0
  98. ksadk/resource_runtime/build_artifacts.py +165 -0
  99. ksadk/resource_runtime/contracts.py +138 -0
  100. ksadk/resource_runtime/discovery_receipts.py +100 -0
  101. ksadk/resource_runtime/discovery_skills.py +172 -0
  102. ksadk/resource_runtime/errors.py +6 -0
  103. ksadk/resource_runtime/ipc.py +142 -0
  104. ksadk/resource_runtime/kernel_approval.py +165 -0
  105. ksadk/resource_runtime/knowledge.py +114 -0
  106. ksadk/resource_runtime/langgraph.py +94 -0
  107. ksadk/resource_runtime/leases.py +191 -0
  108. ksadk/resource_runtime/managed_projection.py +186 -0
  109. ksadk/resource_runtime/mcp_server.py +138 -0
  110. ksadk/resource_runtime/memory_provider.py +318 -0
  111. ksadk/resource_runtime/memory_receipts.py +34 -0
  112. ksadk/resource_runtime/operation_ledger.py +211 -0
  113. ksadk/resource_runtime/plugin_config.py +48 -0
  114. ksadk/resource_runtime/policy_authorization.py +54 -0
  115. ksadk/resource_runtime/process.py +110 -0
  116. ksadk/resource_runtime/skill_artifacts.py +153 -0
  117. ksadk/resource_runtime/skill_runtime.py +42 -0
  118. ksadk/resource_runtime/skill_workspace.py +118 -0
  119. ksadk/resource_runtime/skills.py +215 -0
  120. ksadk/resource_runtime/snapshots.py +180 -0
  121. ksadk/resource_runtime/socket_server.py +103 -0
  122. ksadk/resource_runtime/supervisor.py +380 -0
  123. ksadk/resource_runtime/worker.py +504 -0
  124. ksadk/runners/_langgraph_runner_streams.py +74 -6
  125. ksadk/runners/adk_runner.py +149 -11
  126. ksadk/runners/base_runner.py +29 -1
  127. ksadk/runners/langgraph_runner.py +475 -145
  128. ksadk/runtime/_runner_adapter/stream_mapping.py +142 -18
  129. ksadk/runtime/adapter.py +2 -0
  130. ksadk/runtime/conversation_execution.py +92 -16
  131. ksadk/runtime/executor.py +78 -2
  132. ksadk/runtime/factory.py +29 -273
  133. ksadk/runtime/framework_adapters.py +23 -0
  134. ksadk/runtime/preprocessing.py +10 -2
  135. ksadk/runtime/runner_adapter.py +73 -14
  136. ksadk/runtime_context.py +40 -2
  137. ksadk/sandbox/backends/e2b.py +52 -11
  138. ksadk/sandbox/backends/local_process.py +9 -0
  139. ksadk/sandbox/base.py +2 -0
  140. ksadk/sandbox/e2b_connection.py +66 -0
  141. ksadk/scheduler/sqlite_store.py +18 -0
  142. ksadk/server/composition.py +2 -0
  143. ksadk/server/factory.py +5 -0
  144. ksadk/server/persistence_capability.py +516 -0
  145. ksadk/server/routes/control.py +210 -46
  146. ksadk/server/routes/dependencies.py +15 -0
  147. ksadk/server/routes/models.py +47 -4
  148. ksadk/server/routes/projection.py +252 -12
  149. ksadk/server/routes/sessions.py +284 -107
  150. ksadk/server/routes/streaming.py +43 -9
  151. ksadk/server/static/assets/{ArtifactsPanel-10GPXIJ6.js → ArtifactsPanel-CGbWlMNh.js} +1 -1
  152. ksadk/server/static/assets/{CodeBlock-BXk1l-G1.js → CodeBlock-b4C7upmO.js} +3 -3
  153. ksadk/server/static/assets/{MathMessageMarkdown-D9uB55Oh.js → MathMessageMarkdown-DbdW5A4_.js} +4 -4
  154. ksadk/server/static/assets/{MermaidBlock--OEYoXIJ.js → MermaidBlock-BEBN4Ksz.js} +6 -6
  155. ksadk/server/static/assets/{NativeTerminalPanel-DrEe1syq.js → NativeTerminalPanel-zvL-WpAn.js} +1 -1
  156. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-eeTFJLvo.js → abnfDiagram-VCTEODGH-BYafW7Za.js} +1 -1
  157. ksadk/server/static/assets/{arc-S3ZNbIAd.js → arc-bTohInsS.js} +1 -1
  158. ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +1 -0
  159. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-CRjgEJDX.js → architectureDiagram-5GKGNRK7-Ch5Lbzsi.js} +1 -1
  160. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-C7bsBoNH.js → blockDiagram-NRAW4CY4-kqF4MDOG.js} +1 -1
  161. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BX3c33Ob.js → c4Diagram-UCG6FXSJ-8uSRIODv.js} +1 -1
  162. ksadk/server/static/assets/channel-CF5Up3hQ.js +1 -0
  163. ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +1 -0
  164. ksadk/server/static/assets/{chunk-5VM5RSS4-bZ7ws-8m.js → chunk-5VM5RSS4-DkhehZDr.js} +1 -1
  165. ksadk/server/static/assets/{chunk-F27PBJKO-D2r0pvhY.js → chunk-F27PBJKO-BdXhtPe9.js} +1 -1
  166. ksadk/server/static/assets/{chunk-G27WJ6UU-CZwF3oUP.js → chunk-G27WJ6UU-DPTpvpwi.js} +1 -1
  167. ksadk/server/static/assets/{chunk-JWPE2WC7-DigFYCML.js → chunk-JWPE2WC7-Pqoh38el.js} +1 -1
  168. ksadk/server/static/assets/{chunk-LCL6LL3I-CnorGV5q.js → chunk-LCL6LL3I-DeU00qC-.js} +1 -1
  169. ksadk/server/static/assets/{chunk-POPQ4Y6H-CexntQA-.js → chunk-POPQ4Y6H-CzxScFkr.js} +1 -1
  170. ksadk/server/static/assets/{chunk-RHFEMEQ7-CHTC7UxA.js → chunk-RHFEMEQ7-DpqMx-ux.js} +1 -1
  171. ksadk/server/static/assets/{chunk-SVP7TREG-BC1EWt_-.js → chunk-SVP7TREG-C6t0SypQ.js} +1 -1
  172. ksadk/server/static/assets/{chunk-XXDRQBXY-BTG24xN0.js → chunk-XXDRQBXY-DVaeafZk.js} +1 -1
  173. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +1 -0
  174. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +1 -0
  175. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-CkonRdAS.js → cose-bilkent-JH36ORCC-Bf9D3tzJ.js} +1 -1
  176. ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +1 -0
  177. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-DEOCBe15.js → cynefinDiagram-5FMLGOSQ-B9cY3iTz.js} +1 -1
  178. ksadk/server/static/assets/{dagre-3AP2YEHR-DBThPuLa.js → dagre-3AP2YEHR-CSwlx3CB.js} +1 -1
  179. ksadk/server/static/assets/{dagre-ClTPrTht.js → dagre-UBpgon5q.js} +1 -1
  180. ksadk/server/static/assets/{diagram-S7CK7UJ4-DsZHrnpJ.js → diagram-S7CK7UJ4-C9akhN9a.js} +1 -1
  181. ksadk/server/static/assets/{diagram-UQ7AKVKN-BJR4nhVr.js → diagram-UQ7AKVKN-CgedhTPI.js} +1 -1
  182. ksadk/server/static/assets/{diagram-VSXAHHWV-xzcERX0a.js → diagram-VSXAHHWV-Cjucz5BY.js} +1 -1
  183. ksadk/server/static/assets/{diagram-VX7I27RA-tn2xM1xu.js → diagram-VX7I27RA-Dd4Vleyn.js} +1 -1
  184. ksadk/server/static/assets/{diagram-Z3DM3KII-BZPGBkw5.js → diagram-Z3DM3KII-CZ2jGtYW.js} +1 -1
  185. ksadk/server/static/assets/{dist-DdRBIceA.js → dist-B2_CVgKv.js} +1 -1
  186. ksadk/server/static/assets/{dist-Cq4OL6nO.js → dist-B3FR1SKK.js} +1 -1
  187. ksadk/server/static/assets/{dist-M67Hwu0n.js → dist-BIr4DSRq.js} +1 -1
  188. ksadk/server/static/assets/{dist-B1oWRmrH.js → dist-BgV_owcB.js} +1 -1
  189. ksadk/server/static/assets/{dist-DyqV4fL4.js → dist-Bj730Ib4.js} +1 -1
  190. ksadk/server/static/assets/{dist-DfGFrb0v.js → dist-BnaTiyzN.js} +1 -1
  191. ksadk/server/static/assets/{dist-C71CsujO.js → dist-C1NMAY5a.js} +1 -1
  192. ksadk/server/static/assets/{dist-CXpH_Rdd.js → dist-C5_ZAZsG.js} +1 -1
  193. ksadk/server/static/assets/{dist-DJmCPRVB.js → dist-CB9iJrvg.js} +1 -1
  194. ksadk/server/static/assets/{dist-DjhwGUgZ.js → dist-CFzsn6BG.js} +1 -1
  195. ksadk/server/static/assets/{dist-BI1qQH4n.js → dist-Cf125P_m.js} +1 -1
  196. ksadk/server/static/assets/{dist-8VWI-2bZ.js → dist-ClYUxfeK.js} +1 -1
  197. ksadk/server/static/assets/{dist-DUwKa_l6.js → dist-DFD6Qa6T.js} +1 -1
  198. ksadk/server/static/assets/{dist-B-46q3Hk.js → dist-DVCOWtha.js} +1 -1
  199. ksadk/server/static/assets/{dist-BJLUwH6W.js → dist-D_ctSS2i.js} +1 -1
  200. ksadk/server/static/assets/{dist-4zN1_tq5.js → dist-DiixqL0J.js} +1 -1
  201. ksadk/server/static/assets/{dist-B0gdk4rl.js → dist-DoVSwoDb.js} +1 -1
  202. ksadk/server/static/assets/{dist-Bbwqa8TG.js → dist-DvFK7p5S.js} +1 -1
  203. ksadk/server/static/assets/{dist-D1V3f1B4.js → dist-QfkEHOlb.js} +1 -1
  204. ksadk/server/static/assets/{dist-Btyo4vX4.js → dist-btbmmX5O.js} +1 -1
  205. ksadk/server/static/assets/{dist-u8tVH5Ak.js → dist-fBO2v5Kt.js} +1 -1
  206. ksadk/server/static/assets/{dist-DQAB0qn_.js → dist-ufY3F5p6.js} +1 -1
  207. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-DVfMsLge.js → ebnfDiagram-PWID7BFC-Ci8NqqZu.js} +1 -1
  208. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CWEZSYaw.js → erDiagram-SSCWMZ5O-CCIOhLZG.js} +1 -1
  209. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +1 -0
  210. ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +1 -0
  211. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-TWIxoyYL.js → ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js} +1 -1
  212. ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +1 -0
  213. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DDh2hd2S.js → gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js} +1 -1
  214. ksadk/server/static/assets/index-DcTML1Up.css +2 -0
  215. ksadk/server/static/assets/index-Dh2XHqPK.js +244 -0
  216. ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +1 -0
  217. ksadk/server/static/assets/{infoDiagram-RXCK75RN-CgoyWiDR.js → infoDiagram-RXCK75RN-CO0rRTRA.js} +1 -1
  218. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CyRIu_om.js → ishikawaDiagram-5VMMS53U-CHiaedSS.js} +1 -1
  219. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DN5JXHzN.js → journeyDiagram-EYS64GPL-CHcCIB09.js} +1 -1
  220. ksadk/server/static/assets/{kanban-definition-3QL26DDD-CNP3ui66.js → kanban-definition-3QL26DDD-CJ_ebBZf.js} +1 -1
  221. ksadk/server/static/assets/{katex-DWEzQy1d.js → katex-B4weu383.js} +1 -1
  222. ksadk/server/static/assets/{linear-C-qHp7d2.js → linear-V-MgYHW1.js} +1 -1
  223. ksadk/server/static/assets/{mermaid-parser.core-Cl-K943T.js → mermaid-parser.core-CBijEX_c.js} +2 -2
  224. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-D5DB5mYm.js → mindmap-definition-FBJOCRG2-Bc-pQvpp.js} +1 -1
  225. ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +1 -0
  226. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-BQVc9ia_.js → pegDiagram-XKGWAZYB-D7genGLl.js} +1 -1
  227. ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +1 -0
  228. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-B6UCAvtY.js → pieDiagram-E7YTZNPT-Bxj32zwD.js} +1 -1
  229. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-mIr2d3eb.js → quadrantDiagram-AXDQQJYC-BURv2mGh.js} +1 -1
  230. ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +1 -0
  231. ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +1 -0
  232. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +1 -0
  233. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +1 -0
  234. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +1 -0
  235. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-Dt3FFDmK.js → railroadDiagram-O6MQD6OU-CCsh3avW.js} +1 -1
  236. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-Cz_vQtgF.js → requirementDiagram-EFPCY7ZU-_FRRBKEd.js} +1 -1
  237. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-wlO1TsH5.js → sankeyDiagram-P5KCCOFB-C-gr2o9M.js} +1 -1
  238. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CHRbElYq.js → sequenceDiagram-WJ2MYXX4-D97NmfKg.js} +1 -1
  239. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DXX54iyO.js → sizeCapture-X5ZJPWSS-DjrPC5FX.js} +1 -1
  240. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-Dp_lw9II.js → stateDiagram-HBIQ2CUA-DzMNg1hh.js} +1 -1
  241. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +1 -0
  242. ksadk/server/static/assets/{swimlanes-XN3QIQJK-D8O5UlLG.js → swimlanes-XN3QIQJK-Cssf_CsU.js} +1 -1
  243. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +8 -0
  244. ksadk/server/static/assets/{timeline-definition-24CTP7MA-8mfKcxvG.js → timeline-definition-24CTP7MA-BWTHzyS1.js} +1 -1
  245. ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +1 -0
  246. ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +1 -0
  247. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-EnNl0DE7.js → vennDiagram-4TSXK5OY-BSKgJsmR.js} +1 -1
  248. ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +1 -0
  249. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DBu5fbYr.js → wardleyDiagram-VM6X3IG4-eflHNoaZ.js} +1 -1
  250. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BSVXs4IY.js → xychartDiagram-S5SC5T6Z-eYqrQ-v4.js} +1 -1
  251. ksadk/server/static/index.html +2 -2
  252. ksadk/session_context.py +66 -0
  253. ksadk/sessions/__init__.py +11 -21
  254. ksadk/sessions/_local_service_sync.py +263 -1
  255. ksadk/sessions/base.py +176 -0
  256. ksadk/sessions/errors.py +4 -0
  257. ksadk/sessions/in_memory.py +309 -19
  258. ksadk/sessions/local_service.py +83 -1
  259. ksadk/sessions/persistence.py +275 -0
  260. ksadk/sessions/postgres_service.py +358 -0
  261. ksadk/sessions/resilience.py +8 -0
  262. ksadk/sessions/resilient.py +362 -4
  263. ksadk/sessions/topology.py +135 -0
  264. ksadk/skills/models.py +26 -4
  265. ksadk/skills/package_store.py +186 -38
  266. ksadk/skills/runtime/agent.py +31 -6
  267. ksadk/skills/runtime/artifact_delivery.py +139 -0
  268. ksadk/skills/runtime/backends/e2b.py +98 -6
  269. ksadk/skills/runtime/backends/local.py +73 -8
  270. ksadk/skills/runtime/base.py +3 -0
  271. ksadk/skills/runtime/executor.py +2 -0
  272. ksadk/skills/runtime/loader.py +10 -2
  273. ksadk/skills/runtime/pinned.py +114 -0
  274. ksadk/skills/runtime/request.py +31 -0
  275. ksadk/skills/service_client.py +167 -28
  276. ksadk/studio/api.py +224 -42
  277. ksadk/studio/api_catalog_routes.py +18 -0
  278. ksadk/studio/api_plugin_routes.py +526 -95
  279. ksadk/studio/api_resource_connections.py +183 -0
  280. ksadk/studio/authoring_coordinator.py +19 -14
  281. ksadk/studio/builder.py +76 -0
  282. ksadk/studio/cloud.py +342 -104
  283. ksadk/studio/cloud_shared_web.py +565 -0
  284. ksadk/studio/codex_agent_service.py +128 -26
  285. ksadk/studio/codex_builder.py +241 -2
  286. ksadk/studio/codex_credentials.py +90 -0
  287. ksadk/studio/codex_manifest.py +31 -4
  288. ksadk/studio/codex_plugin_store.py +746 -0
  289. ksadk/studio/codex_provider_build.py +231 -0
  290. ksadk/studio/codex_run.py +184 -25
  291. ksadk/studio/compatibility_report.py +12 -1
  292. ksadk/studio/compiler.py +78 -14
  293. ksadk/studio/contracts.py +132 -6
  294. ksadk/studio/dsh_application.py +137 -0
  295. ksadk/studio/dsh_capability_service.py +1107 -0
  296. ksadk/studio/dsh_models.py +59 -0
  297. ksadk/studio/dsh_provider_registration.py +320 -13
  298. ksadk/studio/hosted_kernel.py +88 -13
  299. ksadk/studio/mcp_runtime.py +11 -3
  300. ksadk/studio/model_client.py +2 -2
  301. ksadk/studio/plugin_composition.py +190 -23
  302. ksadk/studio/plugin_kernel_adapter.py +12 -112
  303. ksadk/studio/plugin_runtime.py +224 -45
  304. ksadk/studio/resource_authority.py +637 -0
  305. ksadk/studio/resource_binding_validation.py +77 -0
  306. ksadk/studio/resource_build_admission.py +196 -0
  307. ksadk/studio/resource_build_materializer.py +149 -0
  308. ksadk/studio/resource_catalog.py +143 -2
  309. ksadk/studio/resource_connections.py +220 -0
  310. ksadk/studio/run_service.py +462 -52
  311. ksadk/studio/runtime_source.py +15 -7
  312. ksadk/studio/scheduler_assistant.py +317 -0
  313. ksadk/studio/scheduler_runtime.py +9 -0
  314. ksadk/studio/scheduler_service.py +3 -0
  315. ksadk/studio/service.py +490 -44
  316. ksadk/studio/shared_web.py +446 -62
  317. ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +41 -0
  318. ksadk/studio/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  319. ksadk/studio/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  320. ksadk/studio/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  321. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  322. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  323. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  324. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  325. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  326. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  327. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  328. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  329. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  330. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  331. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  332. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  333. ksadk/studio/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  334. ksadk/studio/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  335. ksadk/studio/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  336. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  337. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  338. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  339. ksadk/studio/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  340. ksadk/studio/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  341. ksadk/studio/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  342. ksadk/studio/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  343. ksadk/studio/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  344. ksadk/studio/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  345. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  346. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  347. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  348. ksadk/studio/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  349. ksadk/studio/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  350. ksadk/studio/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  351. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  352. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  353. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  354. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  355. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  356. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  357. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  358. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  359. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  360. ksadk/studio/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  361. ksadk/studio/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  362. ksadk/studio/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  363. ksadk/studio/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  364. ksadk/studio/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  365. ksadk/studio/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  366. ksadk/studio/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  367. ksadk/studio/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  368. ksadk/studio/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  369. ksadk/studio/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  370. ksadk/studio/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  371. ksadk/studio/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  372. ksadk/studio/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  373. ksadk/studio/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  374. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  375. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  376. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  377. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--BEOyPC3w.css +1 -0
  378. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +8 -0
  379. ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +44 -0
  380. ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +3 -0
  381. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +1 -0
  382. ksadk/studio/static/assets/arc-Pry-7G1_.js +1 -0
  383. ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +1 -0
  384. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +36 -0
  385. ksadk/studio/static/assets/array-BifhSqXX.js +1 -0
  386. ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CFmPl1de.js +129 -0
  387. ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BRrGu8qt.js +38 -0
  388. ksadk/studio/static/assets/channel-BqO-gtEw.js +1 -0
  389. ksadk/studio/static/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  390. ksadk/studio/static/assets/chunk-4HAMMTFA-D220vUtq.js +62 -0
  391. ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  392. ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +2 -0
  393. ksadk/studio/static/assets/chunk-DU6HZSFF-C4DtVpCu.js +128 -0
  394. ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +1 -0
  395. ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
  396. ksadk/studio/static/assets/chunk-GMAD6QVW-DiQA-u2N.js +72 -0
  397. ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +1 -0
  398. ksadk/studio/static/assets/chunk-IMKFNOWR-BSlbjT_b.js +231 -0
  399. ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  400. ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +1 -0
  401. ksadk/studio/static/assets/chunk-OSK3NFVY-M2m6G3j4.js +10 -0
  402. ksadk/studio/static/assets/chunk-P2QGCYS3-DezaQxiK.js +1 -0
  403. ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +1 -0
  404. ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +1 -0
  405. ksadk/studio/static/assets/chunk-SHT3W25Y-DAyIVp5H.js +168 -0
  406. ksadk/studio/static/assets/chunk-SVP7TREG-DulomOrS.js +88 -0
  407. ksadk/studio/static/assets/chunk-TICWLB2K-bHJYoflj.js +206 -0
  408. ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +1 -0
  409. ksadk/studio/static/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  410. ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +1 -0
  411. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +1 -0
  412. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +1 -0
  413. ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +1 -0
  414. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +62 -0
  415. ksadk/studio/static/assets/cytoscape.esm-CGd-uY3x.js +321 -0
  416. ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +4 -0
  417. ksadk/studio/static/assets/dagre-PrKaheQc.js +1 -0
  418. ksadk/studio/static/assets/defaultLocale-BFoDCU3G.js +1 -0
  419. ksadk/studio/static/assets/diagram-S7CK7UJ4-0BZ98mya.js +30 -0
  420. ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +41 -0
  421. ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +3 -0
  422. ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +24 -0
  423. ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +24 -0
  424. ksadk/studio/static/assets/dist-v5Q1xZ2K.js +1 -0
  425. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +1 -0
  426. ksadk/studio/static/assets/erDiagram-RLTQ6QDP-DLGry2Ap.js +99 -0
  427. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +1 -0
  428. ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +1 -0
  429. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +292 -0
  430. ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +1 -0
  431. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +106 -0
  432. ksadk/studio/static/assets/graphlib-DS17s2tU.js +1 -0
  433. ksadk/studio/static/assets/index-CeHL9ARV.css +2 -0
  434. ksadk/studio/static/assets/index-D9QEcVpL.js +320 -0
  435. ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +1 -0
  436. ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +2 -0
  437. ksadk/studio/static/assets/init-C-OQMol4.js +1 -0
  438. ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-CljI2wyf.js +70 -0
  439. ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-D50Fo2sL.js +139 -0
  440. ksadk/studio/static/assets/kanban-definition-UXKFOSKX-DimfOTam.js +89 -0
  441. ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
  442. ksadk/studio/static/assets/line-CX5BOOUP.js +1 -0
  443. ksadk/studio/static/assets/linear-BCxN9JLv.js +1 -0
  444. ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +7 -0
  445. ksadk/studio/static/assets/mindmap-definition-YA3MSWOX-Bizzqy5R.js +96 -0
  446. ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
  447. ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +1 -0
  448. ksadk/studio/static/assets/path-fybaL0A-.js +1 -0
  449. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +1 -0
  450. ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +1 -0
  451. ksadk/studio/static/assets/pieDiagram-E7YTZNPT-B9mrFSDF.js +39 -0
  452. ksadk/studio/static/assets/quadrantDiagram-AXDQQJYC-NzUfCbMR.js +7 -0
  453. ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +1 -0
  454. ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +1 -0
  455. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +1 -0
  456. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +1 -0
  457. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +1 -0
  458. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +1 -0
  459. ksadk/studio/static/assets/requirementDiagram-BXWQKSXE-BF3d103U.js +84 -0
  460. ksadk/studio/static/assets/rolldown-runtime-Dy4uBu1J-DK3Fl9T5.js +1 -0
  461. ksadk/studio/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
  462. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +40 -0
  463. ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js +162 -0
  464. ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  465. ksadk/studio/static/assets/src-SFn9St9H.js +1 -0
  466. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +1 -0
  467. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +1 -0
  468. ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +1 -0
  469. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +8 -0
  470. ksadk/studio/static/assets/timeline-definition-24CTP7MA-DxmSSjRB.js +120 -0
  471. ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +1 -0
  472. ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +1 -0
  473. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +34 -0
  474. ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +1 -0
  475. ksadk/studio/static/assets/wardleyDiagram-VM6X3IG4-Ba1AOWoe.js +78 -0
  476. ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js +7 -0
  477. ksadk/studio/static/index.html +2 -2
  478. ksadk/version.py +1 -1
  479. ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +0 -1
  480. ksadk/server/static/assets/channel-s354Yo6o.js +0 -1
  481. ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +0 -1
  482. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +0 -1
  483. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +0 -1
  484. ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +0 -1
  485. ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +0 -1
  486. ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +0 -1
  487. ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +0 -1
  488. ksadk/server/static/assets/index-B2k_urY8.js +0 -241
  489. ksadk/server/static/assets/index-ILPt6IWF.css +0 -2
  490. ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +0 -1
  491. ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +0 -1
  492. ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +0 -1
  493. ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +0 -1
  494. ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +0 -1
  495. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +0 -1
  496. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +0 -1
  497. ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +0 -1
  498. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +0 -1
  499. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +0 -8
  500. ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +0 -1
  501. ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +0 -1
  502. ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +0 -1
  503. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
  504. ksadk/studio/static/assets/index-DXs1Eq4M.css +0 -1
  505. ksadk/studio/static/assets/index-DeDqwTsD.js +0 -283
  506. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/WHEEL +0 -0
  507. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/entry_points.txt +0 -0
  508. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/licenses/LICENSE +0 -0
  509. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/top_level.txt +0 -0
ksadk/memory/models.py CHANGED
@@ -127,6 +127,8 @@ class MemoryExtractionStatus:
127
127
  status: str
128
128
  searchable: bool = False
129
129
  message: str = ""
130
+ # Query failure does not prove that the previously submitted write failed.
131
+ error_code: str = ""
130
132
 
131
133
 
132
134
  def map_session_state(state: int | None) -> str:
@@ -176,7 +178,7 @@ class MemoryConflictError(MemoryOperationError):
176
178
  MEMORY_MODEL_VERSION = "v1"
177
179
 
178
180
  MemoryScope = Literal["user", "agent", "workspace", "org"]
179
- MemoryType = Literal["profile", "fact", "episode"]
181
+ MemoryType = Literal["profile", "fact", "episode", "unknown"]
180
182
  MemoryStatus = Literal["active", "superseded", "deleted", "expired"]
181
183
  MemoryOperation = Literal["add", "update", "delete", "ignore"]
182
184
  MemorySearchStatus = Literal["ok", "not_configured", "timeout", "unauthorized", "failed"]
@@ -206,8 +208,8 @@ class MemoryRecord:
206
208
  content: str
207
209
  summary: str
208
210
  status: MemoryStatus
209
- confidence: float
210
- importance: float
211
+ confidence: float | None
212
+ importance: float | None
211
213
  valid_from: str
212
214
  valid_to: str
213
215
  expires_at: str
@@ -215,7 +217,8 @@ class MemoryRecord:
215
217
  source_event_ids: list[str]
216
218
  source_seq_range: tuple[int, int] | None
217
219
  content_hash: str
218
- version: int
220
+ # None means the provider has no record revision/CAS contract.
221
+ version: int | None
219
222
  metadata: dict[str, Any] = field(default_factory=dict)
220
223
  created_at: str = ""
221
224
  updated_at: str = ""
@@ -32,6 +32,9 @@ def resolve_memory_provider(provider_ref: str) -> MemoryProviderLike:
32
32
  """
33
33
  ref = str(provider_ref or "").strip().lower()
34
34
 
35
+ if ref.startswith("binding://"):
36
+ raise ValueError("RESOURCE_MEMORY_BINDING_REQUIRES_ACTIVATION")
37
+
35
38
  if ref in ("local-inmemory", "inmemory"):
36
39
  from ksadk.memory.adk.backends.inmemory_ltm_backend import (
37
40
  InMemoryLTMBackend,
@@ -444,13 +444,18 @@ class ProxyServer:
444
444
  # 应用层取消信号:让活动 SSE 的 _stream_gen 主动 break
445
445
  self._app.state.cancel_event.set()
446
446
  if self._server is not None:
447
- # should_exit 触发主循环进入 shutdown;force_exit 让 shutdown 跳过等待
448
- # connections/tasks 完成(活动 SSE 下不再无限等)。两者缺一:只 should_exit
449
- # 会被活动连接卡死,只 force_exit 主循环根本不进 shutdown。
447
+ # Enter Uvicorn's normal shutdown so its lifespan task receives a
448
+ # shutdown event. Setting force_exit here skips that event and
449
+ # makes every completed Studio turn print a CancelledError.
450
450
  self._server.should_exit = True
451
- self._server.force_exit = True
452
451
  if self._thread is not None:
453
- self._thread.join(timeout=5)
452
+ self._thread.join(timeout=3)
453
+ if self._thread.is_alive() and self._server is not None:
454
+ # The application cancel signal normally drains active SSE
455
+ # generators. Keep a bounded last resort for a broken client
456
+ # or upstream that ignores cancellation.
457
+ self._server.force_exit = True
458
+ self._thread.join(timeout=2)
454
459
  if self._sock is not None:
455
460
  try:
456
461
  self._sock.close()
ksadk/plugins/__init__.py CHANGED
@@ -27,8 +27,10 @@ from ksadk.plugins.context_contributor import (
27
27
  from ksadk.plugins.contracts import (
28
28
  CapabilityDefinition,
29
29
  CompositionProfile,
30
+ LockedPluginComponent,
30
31
  PluginInventory,
31
32
  PluginLock,
33
+ PluginSourceSnapshot,
32
34
  canonical_plugin_lock,
33
35
  plugin_lock_digest,
34
36
  )
@@ -120,6 +122,7 @@ __all__ = [
120
122
  "BridgeTransitionPlan",
121
123
  "CapabilityDefinition",
122
124
  "CompositionProfile",
125
+ "LockedPluginComponent",
123
126
  "ContextClassification",
124
127
  "ContextContributorCacheability",
125
128
  "ContextContributorCapabilities",
@@ -135,6 +138,7 @@ __all__ = [
135
138
  "EcosystemPluginInventory",
136
139
  "PluginInventory",
137
140
  "PluginLock",
141
+ "PluginSourceSnapshot",
138
142
  "PluginDesiredState",
139
143
  "PluginEcosystem",
140
144
  "PluginEcosystemBridge",
@@ -0,0 +1,275 @@
1
+ """Portable plugin bytes; credentials and machine state never belong here.
2
+
3
+ The caller supplies an already verified, selected plugin tree. Delivery and
4
+ credential authorization remain separate from this bounded archive format.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import hashlib
10
+ import json
11
+ import os
12
+ import shutil
13
+ import stat
14
+ import tempfile
15
+ import zipfile
16
+ from pathlib import Path, PurePosixPath
17
+ from typing import Literal
18
+
19
+ from pydantic import BaseModel, ConfigDict, Field
20
+
21
+ MAX_FILES = 10000
22
+ MAX_BYTES = 256 * 1024 * 1024
23
+ SCHEMA = "ksadk.plugin-artifact/v1"
24
+
25
+
26
+ class PluginArtifactReceipt(BaseModel):
27
+ model_config = ConfigDict(extra="forbid")
28
+ schema_version: Literal["ksadk.plugin-artifact/v1"] = SCHEMA
29
+ ecosystem: Literal["codex"] = "codex"
30
+ runtime_version: str = Field(min_length=1)
31
+ plugin_lock_digest: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")
32
+ artifact_digest: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")
33
+ size_bytes: int = Field(gt=0, le=MAX_BYTES)
34
+
35
+
36
+ def _digest(raw: bytes) -> str:
37
+ return "sha256:" + hashlib.sha256(raw).hexdigest()
38
+
39
+
40
+ def _safe_path(value: str) -> str:
41
+ path = PurePosixPath(value)
42
+ if (
43
+ not value
44
+ or "\\" in value
45
+ or path.is_absolute()
46
+ or str(path) != value
47
+ or any(p in {".", ".."} for p in path.parts)
48
+ ):
49
+ raise ValueError("Invalid plugin artifact path")
50
+ forbidden = {".credentials.json", "auth.json", "config.toml", ".git", "sessions"}
51
+ if any(part.lower() in forbidden or part.lower().startswith(".env") for part in path.parts):
52
+ raise ValueError("Plugin artifact contains credential or host state paths")
53
+ return value
54
+
55
+
56
+ def _zip_entry(name: str, mode: int) -> zipfile.ZipInfo:
57
+ info = zipfile.ZipInfo(name, date_time=(1980, 1, 1, 0, 0, 0))
58
+ info.create_system = 3
59
+ info.external_attr = (stat.S_IFREG | mode) << 16
60
+ info.compress_type = zipfile.ZIP_STORED
61
+ return info
62
+
63
+
64
+ def export_plugin_artifact(
65
+ root: Path,
66
+ output_dir: Path,
67
+ *,
68
+ runtime_version: str,
69
+ plugin_lock_digest: str,
70
+ ) -> tuple[PluginArtifactReceipt, Path]:
71
+ """Package only the pinned Codex marketplace, independent of local paths."""
72
+ if root.is_symlink() or not root.is_dir():
73
+ raise ValueError("Plugin artifact root must be a real directory")
74
+ if output_dir.resolve().is_relative_to(root.resolve()):
75
+ raise ValueError("Plugin artifact output must be outside its source tree")
76
+ files = []
77
+ total = 0
78
+ output_dir.mkdir(parents=True, exist_ok=True)
79
+ fd, temporary = tempfile.mkstemp(prefix=".plugin-artifact-", dir=output_dir)
80
+ os.close(fd)
81
+ temporary_path = Path(temporary)
82
+ try:
83
+ with zipfile.ZipFile(temporary_path, "w") as archive:
84
+ for source in sorted(root.rglob("*")):
85
+ if source.is_symlink():
86
+ raise ValueError("Plugin artifacts cannot contain symlinks")
87
+ if source.is_dir():
88
+ _safe_path(source.relative_to(root).as_posix())
89
+ continue
90
+ if not source.is_file():
91
+ raise ValueError("Plugin artifacts require regular files")
92
+ name = _safe_path(source.relative_to(root).as_posix())
93
+ size = source.stat().st_size
94
+ total += size
95
+ if total > MAX_BYTES or len(files) >= MAX_FILES:
96
+ raise ValueError("Plugin artifact exceeds size limits")
97
+ with source.open("rb") as stream:
98
+ raw = stream.read(size + 1)
99
+ if len(raw) != size:
100
+ raise ValueError("Plugin artifact source changed during export")
101
+ mode = 0o644 | (source.stat().st_mode & 0o111)
102
+ files.append({"path": name, "digest": _digest(raw), "size": len(raw), "mode": mode})
103
+ archive.writestr(_zip_entry("payload/" + name, mode), raw)
104
+ if not files:
105
+ raise ValueError("Plugin artifact is empty")
106
+ manifest = {
107
+ "schema_version": SCHEMA,
108
+ "ecosystem": "codex",
109
+ "runtime_version": runtime_version,
110
+ "plugin_lock_digest": plugin_lock_digest,
111
+ "files": files,
112
+ }
113
+ archive.writestr(
114
+ _zip_entry("manifest.json", 0o644),
115
+ json.dumps(manifest, sort_keys=True, separators=(",", ":")).encode(),
116
+ )
117
+ if temporary_path.stat().st_size > MAX_BYTES:
118
+ raise ValueError("Plugin artifact exceeds size limits")
119
+ raw = temporary_path.read_bytes()
120
+ receipt = PluginArtifactReceipt(
121
+ runtime_version=runtime_version,
122
+ plugin_lock_digest=plugin_lock_digest,
123
+ artifact_digest=_digest(raw),
124
+ size_bytes=len(raw),
125
+ )
126
+ target = output_dir / (receipt.artifact_digest.removeprefix("sha256:") + ".zip")
127
+ os.replace(temporary_path, target)
128
+ return receipt, target
129
+ finally:
130
+ temporary_path.unlink(missing_ok=True)
131
+
132
+
133
+ def restore_plugin_artifact(
134
+ archive_path: Path, receipt: PluginArtifactReceipt, target: Path
135
+ ) -> Path:
136
+ """Verify a downloaded archive before atomic installation into a fresh path."""
137
+ if archive_path.stat().st_size != receipt.size_bytes:
138
+ raise ValueError("Plugin artifact size mismatch")
139
+ if _digest(archive_path.read_bytes()) != receipt.artifact_digest:
140
+ raise ValueError("Plugin artifact digest mismatch")
141
+ if target.exists() or target.is_symlink():
142
+ raise ValueError("Plugin artifact target already exists")
143
+ target.parent.mkdir(parents=True, exist_ok=True)
144
+ staging = Path(tempfile.mkdtemp(prefix=".plugin-restore-", dir=target.parent))
145
+ try:
146
+ with zipfile.ZipFile(archive_path) as archive:
147
+ entries = archive.infolist()
148
+ names = [entry.filename for entry in entries]
149
+ if len(names) != len(set(names)) or len(names) > MAX_FILES + 1:
150
+ raise ValueError("Duplicate or excessive plugin archive entries")
151
+ if sum(entry.file_size for entry in entries) > MAX_BYTES:
152
+ raise ValueError("Plugin archive expands beyond size limit")
153
+ manifest = json.loads(archive.read("manifest.json"))
154
+ for key in ("schema_version", "ecosystem", "runtime_version", "plugin_lock_digest"):
155
+ if manifest.get(key) != getattr(receipt, key):
156
+ raise ValueError("Plugin artifact manifest mismatch")
157
+ files = manifest.get("files")
158
+ if not isinstance(files, list) or not files:
159
+ raise ValueError("Missing plugin artifact file index")
160
+ expected = ["payload/" + _safe_path(item["path"]) for item in files]
161
+ if len(expected) != len(set(expected)) or set(names) != {"manifest.json", *expected}:
162
+ raise ValueError("Plugin artifact file index mismatch")
163
+ for item, name in zip(files, expected, strict=True):
164
+ info = archive.getinfo(name)
165
+ mode = info.external_attr >> 16
166
+ if not stat.S_ISREG(mode) or (item["mode"] & ~0o111) != 0o644:
167
+ raise ValueError("Plugin artifact has invalid file type or mode")
168
+ raw = archive.read(name)
169
+ if len(raw) != item["size"] or _digest(raw) != item["digest"]:
170
+ raise ValueError("Plugin artifact file digest mismatch")
171
+ destination = staging / item["path"]
172
+ destination.parent.mkdir(parents=True, exist_ok=True)
173
+ destination.write_bytes(raw)
174
+ destination.chmod(item["mode"])
175
+ os.replace(staging, target)
176
+ return target
177
+ finally:
178
+ if staging.exists():
179
+ shutil.rmtree(staging)
180
+
181
+
182
+ def restore_materialized_plugin_artifact(
183
+ source: Path, receipt: PluginArtifactReceipt, target: Path
184
+ ) -> Path:
185
+ """Verify an init-container-extracted artifact before atomic installation.
186
+
187
+ The init container verifies the downloaded archive digest before extraction.
188
+ The runtime independently verifies the portable manifest and every extracted
189
+ file before the marketplace becomes visible to Codex.
190
+ """
191
+ if source.is_symlink() or not source.is_dir():
192
+ raise ValueError("Materialized plugin artifact must be a real directory")
193
+ if target.exists() or target.is_symlink():
194
+ raise ValueError("Plugin artifact target already exists")
195
+
196
+ manifest_path = source / "manifest.json"
197
+ if manifest_path.is_symlink() or not manifest_path.is_file():
198
+ raise ValueError("Missing plugin artifact manifest")
199
+ if manifest_path.stat().st_size > MAX_BYTES:
200
+ raise ValueError("Plugin artifact manifest exceeds size limit")
201
+ try:
202
+ manifest = json.loads(manifest_path.read_bytes())
203
+ except (json.JSONDecodeError, UnicodeError) as exc:
204
+ raise ValueError("Invalid plugin artifact manifest") from exc
205
+ if not isinstance(manifest, dict):
206
+ raise ValueError("Plugin artifact manifest must be an object")
207
+ for key in ("schema_version", "ecosystem", "runtime_version", "plugin_lock_digest"):
208
+ if manifest.get(key) != getattr(receipt, key):
209
+ raise ValueError("Plugin artifact manifest mismatch")
210
+
211
+ files = manifest.get("files")
212
+ if not isinstance(files, list) or not files or len(files) > MAX_FILES:
213
+ raise ValueError("Missing or excessive plugin artifact file index")
214
+
215
+ indexed: list[tuple[dict, str]] = []
216
+ expected = {"manifest.json"}
217
+ for item in files:
218
+ if not isinstance(item, dict):
219
+ raise ValueError("Invalid plugin artifact file index")
220
+ try:
221
+ name = _safe_path(item["path"])
222
+ size = int(item["size"])
223
+ mode = int(item["mode"])
224
+ digest = str(item["digest"])
225
+ except (KeyError, TypeError, ValueError) as exc:
226
+ raise ValueError("Invalid plugin artifact file index") from exc
227
+ if size < 0 or size > MAX_BYTES or (mode & ~0o111) != 0o644:
228
+ raise ValueError("Plugin artifact has invalid file size or mode")
229
+ if not digest.startswith("sha256:") or len(digest) != 71:
230
+ raise ValueError("Plugin artifact has invalid file digest")
231
+ relative = "payload/" + name
232
+ if relative in expected:
233
+ raise ValueError("Duplicate plugin artifact file index")
234
+ expected.add(relative)
235
+ indexed.append((item, relative))
236
+
237
+ actual: set[str] = set()
238
+ for path in source.rglob("*"):
239
+ relative = path.relative_to(source).as_posix()
240
+ if path.is_symlink():
241
+ raise ValueError("Plugin artifacts cannot contain symlinks")
242
+ if path.is_dir():
243
+ _safe_path(relative)
244
+ continue
245
+ if not path.is_file():
246
+ raise ValueError("Plugin artifacts require regular files")
247
+ actual.add(relative)
248
+ if actual != expected:
249
+ raise ValueError("Plugin artifact file index mismatch")
250
+
251
+ target.parent.mkdir(parents=True, exist_ok=True)
252
+ staging = Path(tempfile.mkdtemp(prefix=".plugin-restore-", dir=target.parent))
253
+ total = 0
254
+ try:
255
+ for item, relative in indexed:
256
+ source_file = source / relative
257
+ size = int(item["size"])
258
+ with source_file.open("rb") as stream:
259
+ raw = stream.read(size + 1)
260
+ total += len(raw)
261
+ if (
262
+ len(raw) != size
263
+ or total > MAX_BYTES
264
+ or _digest(raw) != item["digest"]
265
+ ):
266
+ raise ValueError("Plugin artifact file digest mismatch")
267
+ destination = staging / item["path"]
268
+ destination.parent.mkdir(parents=True, exist_ok=True)
269
+ destination.write_bytes(raw)
270
+ destination.chmod(int(item["mode"]))
271
+ os.replace(staging, target)
272
+ return target
273
+ finally:
274
+ if staging.exists():
275
+ shutil.rmtree(staging)
@@ -7,6 +7,8 @@ not add a generic plugin execution API to KsADK.
7
7
  from ksadk.plugins.bridges.codex import (
8
8
  CodexAppServerPluginBridge,
9
9
  CodexBridgeError,
10
+ CodexHostComponentDetail,
11
+ CodexMarketplaceAddResult,
10
12
  CodexPluginApprovalRequired,
11
13
  CodexPluginDetail,
12
14
  CodexPluginInventory,
@@ -15,7 +17,6 @@ from ksadk.plugins.bridges.codex import (
15
17
  from ksadk.plugins.bridges.dsh import (
16
18
  DshBridgeError,
17
19
  DshBridgeHost,
18
- DshClientBundle,
19
20
  DshHostUnavailableError,
20
21
  DshPluginApprovalRequired,
21
22
  DshPluginInventory,
@@ -28,13 +29,14 @@ from ksadk.plugins.bridges.dsh import (
28
29
  __all__ = [
29
30
  "CodexAppServerPluginBridge",
30
31
  "CodexBridgeError",
32
+ "CodexHostComponentDetail",
33
+ "CodexMarketplaceAddResult",
31
34
  "CodexPluginApprovalRequired",
32
35
  "CodexPluginDetail",
33
36
  "CodexPluginInventory",
34
37
  "CodexPluginNotFoundError",
35
38
  "DshBridgeError",
36
39
  "DshBridgeHost",
37
- "DshClientBundle",
38
40
  "DshHostUnavailableError",
39
41
  "DshPluginApprovalRequired",
40
42
  "DshPluginInventory",
@@ -21,7 +21,7 @@ def _to_camel(value: str) -> str:
21
21
  return head + "".join(part.capitalize() for part in tail)
22
22
 
23
23
 
24
- class _CodexWireModel(BaseModel):
24
+ class _CodexPublicModel(BaseModel):
25
25
  model_config = ConfigDict(
26
26
  alias_generator=_to_camel,
27
27
  populate_by_name=True,
@@ -30,6 +30,17 @@ class _CodexWireModel(BaseModel):
30
30
  )
31
31
 
32
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
+
33
44
  class _LocalSource(_CodexWireModel):
34
45
  type: Literal["local"]
35
46
  path: str
@@ -130,7 +141,7 @@ class _PluginUninstallResponse(_CodexWireModel):
130
141
  pass
131
142
 
132
143
 
133
- class CodexPluginInventory(_CodexWireModel):
144
+ class CodexPluginInventory(_CodexPublicModel):
134
145
  """Normalized observed state; install receipt never implies these fields."""
135
146
 
136
147
  plugin_id: str
@@ -142,6 +153,7 @@ class CodexPluginInventory(_CodexWireModel):
142
153
  enabled: bool
143
154
  availability: str
144
155
  source: CodexPluginSource = Field(discriminator="type")
156
+ interface: dict[str, Any] = Field(default_factory=dict)
145
157
  permissions_declared: Literal[False] = False
146
158
  risk_disclosures: tuple[str, ...] = (
147
159
  "Codex plugin permissions are host-managed and not declared in the plugin manifest.",
@@ -149,29 +161,47 @@ class CodexPluginInventory(_CodexWireModel):
149
161
  )
150
162
 
151
163
 
152
- class CodexPluginDetail(_CodexWireModel):
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):
153
174
  inventory: CodexPluginInventory
154
175
  description: str | None = None
176
+ share_url: str | None = None
155
177
  skills: tuple[str, ...] = ()
156
178
  mcp_servers: tuple[str, ...] = ()
157
179
  hooks: tuple[str, ...] = ()
158
180
  apps: tuple[str, ...] = ()
159
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
160
190
 
161
191
 
162
- class CodexPluginInstallResult(_CodexWireModel):
192
+ class CodexPluginInstallResult(_CodexPublicModel):
163
193
  inventory: CodexPluginInventory
164
194
  auth_policy: Literal["ON_INSTALL", "ON_USE"]
165
195
  apps_needing_auth: tuple[str, ...] = ()
166
196
 
167
197
 
168
- class CodexPluginUninstallResult(_CodexWireModel):
198
+ class CodexPluginUninstallResult(_CodexPublicModel):
169
199
  plugin_id: str
170
200
  installed: Literal[False] = False
171
201
  enabled: Literal[False] = False
172
202
 
173
203
 
174
- class CodexBridgeHost(_CodexWireModel):
204
+ class CodexBridgeHost(_CodexPublicModel):
175
205
  host_id: Literal["codex-app-server"] = "codex-app-server"
176
206
  version: str
177
207
  protocol: Literal["codex.app-server/v1"] = "codex.app-server/v1"
@@ -231,6 +261,63 @@ def _reported_host_version(metadata: Any) -> str:
231
261
  return match.group(1) if match is not None else "unreported"
232
262
 
233
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
+
234
321
  class CodexAppServerPluginBridge:
235
322
  """Allowlisted Codex plugin manager backed by one App Server process."""
236
323
 
@@ -290,12 +377,27 @@ class CodexAppServerPluginBridge:
290
377
  await transport.close()
291
378
 
292
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
+
293
391
  response = await self._request(
294
392
  "marketplace/add",
295
393
  {"source": source, "refName": ref_name, "sparsePaths": None},
296
394
  _MarketplaceAddResponse,
297
395
  )
298
- return response.marketplace_name
396
+ return CodexMarketplaceAddResult(
397
+ marketplace_name=response.marketplace_name,
398
+ installed_root=response.installed_root,
399
+ already_added=response.already_added,
400
+ )
299
401
 
300
402
  async def list_plugins(
301
403
  self, *, force_refetch: bool = False
@@ -324,18 +426,20 @@ class CodexAppServerPluginBridge:
324
426
  _PluginReadResponse,
325
427
  )
326
428
  plugin = response.plugin
429
+ components = _reported_components(plugin)
327
430
  return CodexPluginDetail(
328
431
  inventory=self._inventory(marketplace, plugin.summary),
329
432
  description=plugin.description,
330
- skills=tuple(str(item.get("name", "")) for item in plugin.skills if item.get("name")),
433
+ share_url=plugin.share_url,
434
+ skills=tuple(component.name for component in components if component.kind == "skill"),
331
435
  mcp_servers=plugin.mcp_servers,
332
- hooks=tuple(str(item.get("key", "")) for item in plugin.hooks if item.get("key")),
333
- apps=tuple(str(item.get("id", "")) for item in plugin.apps if item.get("id")),
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"),
334
438
  scheduled_tasks=tuple(
335
- str(item.get("key", ""))
336
- for item in (plugin.scheduled_tasks or ())
337
- if item.get("key")
439
+ component.name for component in components if component.kind == "scheduled-task"
338
440
  ),
441
+ components=components,
442
+ host_metadata=dict(plugin.model_extra or {}),
339
443
  )
340
444
 
341
445
  async def install_plugin(
@@ -536,6 +640,7 @@ class CodexAppServerPluginBridge:
536
640
  enabled=summary.enabled,
537
641
  availability=summary.availability,
538
642
  source=summary.source,
643
+ interface=summary.interface or {},
539
644
  )
540
645
 
541
646
 
@@ -543,6 +648,8 @@ __all__ = [
543
648
  "CodexAppServerPluginBridge",
544
649
  "CodexBridgeError",
545
650
  "CodexBridgeHost",
651
+ "CodexHostComponentDetail",
652
+ "CodexMarketplaceAddResult",
546
653
  "CodexPluginApprovalRequired",
547
654
  "CodexPluginDetail",
548
655
  "CodexPluginInstallResult",