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/codex/runtime.py CHANGED
@@ -19,19 +19,15 @@
19
19
  from __future__ import annotations
20
20
 
21
21
  import asyncio
22
- import base64
23
- import binascii
24
- import hashlib
25
22
  import json
26
23
  import logging
27
- import re
28
24
  import time
29
25
  from collections.abc import Mapping
30
26
  from dataclasses import dataclass, field
31
- from pathlib import Path
32
27
  from typing import Any, AsyncIterator, Optional
33
28
 
34
- from ksadk.codex.client import CodexClient
29
+ from ksadk.codex.client import CodexClient, CodexPluginBootstrap
30
+ from ksadk.codex.projection import CodexTurnProjection
35
31
  from ksadk.events.adapters.codex import CodexAdapterContext, CodexEventAdapter
36
32
  from ksadk.events.canonical import (
37
33
  ErrorInfo,
@@ -108,12 +104,25 @@ class CodexRuntimeAdapter(RuntimeAdapter):
108
104
  sandbox_read_only: bool = True,
109
105
  turn_timeout_seconds: Optional[float] = None,
110
106
  bound_skill_paths: Mapping[str, str] | None = None,
107
+ plugin_bootstrap: CodexPluginBootstrap | None = None,
108
+ turn_projector: CodexTurnProjection | None = None,
111
109
  ) -> None:
112
110
  super().__init__(_CodexAsBaseRuntime(client))
113
111
  self._client = client
114
112
  self._sandbox_read_only = sandbox_read_only
115
113
  self._turn_timeout_seconds = turn_timeout_seconds
116
- self._bound_skill_paths = dict(bound_skill_paths or {})
114
+ if turn_projector is not None and bound_skill_paths:
115
+ raise ValueError("Skill paths must be owned by the supplied turn projector")
116
+ if turn_projector is None:
117
+ # Compatibility for direct SDK construction; production factories inject
118
+ # the same official projector, never a second input implementation.
119
+ from ksadk.plugins.providers.codex_turn import CodexTurnProjector
120
+
121
+ turn_projector = CodexTurnProjector(bound_skill_paths=bound_skill_paths)
122
+ self._turn_projector = turn_projector
123
+ self._plugin_bootstrap = plugin_bootstrap
124
+ self._plugin_bootstrap_lock = asyncio.Lock()
125
+ self._plugins_bootstrapped = False
117
126
  self._threads: dict[str, _CodexThread] = {}
118
127
  self._requests: dict[str, StartRequest] = {}
119
128
  self._known_threads: set[str] = set()
@@ -155,27 +164,13 @@ class CodexRuntimeAdapter(RuntimeAdapter):
155
164
  # ---- 六动词 ----
156
165
 
157
166
  async def start(self, request: StartRequest) -> RunHandle:
167
+ # A failed bootstrap must leave no native thread behind. The success
168
+ # bit is set only after marketplace/add, every plugin/install, and the
169
+ # enabled-inventory reconciliation all complete on this same client.
170
+ await self._bootstrap_plugins_once()
158
171
  # 新 thread 由后端分配真实 thread_id(thread_start);metadata 携带的 thread_id
159
172
  # 表示接入既有 thread(resume 语义,run_turn 时按 resume 接入)。
160
- if self._bound_skill_paths:
161
- skills = request.config.get("skills") if request.config else None
162
- if isinstance(skills, list):
163
- projected_skills = []
164
- for item in skills:
165
- if not isinstance(item, dict):
166
- continue
167
- name = str(item.get("name") or "").strip()
168
- projected_skills.append(
169
- {
170
- **item,
171
- "path": self._bound_skill_paths.get(
172
- name, str(item.get("path") or "")
173
- ),
174
- }
175
- )
176
- request = request.model_copy(
177
- update={"config": {**request.config, "skills": projected_skills}}
178
- )
173
+ request = self._turn_projector.prepare(request)
179
174
  provided = request.metadata.get("thread_id")
180
175
  if provided:
181
176
  thread_id = str(provided)
@@ -219,6 +214,16 @@ class CodexRuntimeAdapter(RuntimeAdapter):
219
214
  native_ref={"thread_id": thread_id, "user_id": request.user_id},
220
215
  )
221
216
 
217
+ async def _bootstrap_plugins_once(self) -> None:
218
+ config = self._plugin_bootstrap
219
+ if config is None or self._plugins_bootstrapped:
220
+ return
221
+ async with self._plugin_bootstrap_lock:
222
+ if self._plugins_bootstrapped:
223
+ return
224
+ await self._client.bootstrap_plugins(config)
225
+ self._plugins_bootstrapped = True
226
+
222
227
  def stream(self, handle: RunHandle) -> AsyncIterator[RuntimeEvent]:
223
228
  return self._stream_events(handle)
224
229
 
@@ -298,7 +303,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
298
303
  elif payload.kind == "hitl_answer":
299
304
  resolved = await self._client.resolve_interaction(
300
305
  payload.call_id,
301
- {key: value for key, value in raw.items() if key != "decision"},
306
+ raw,
302
307
  )
303
308
  else:
304
309
  raise ValueError("Codex live submit requires approval_decision or hitl_answer")
@@ -378,6 +383,12 @@ class CodexRuntimeAdapter(RuntimeAdapter):
378
383
  self._do_not_persist.add(handle.run_id)
379
384
  await self.close_all()
380
385
 
386
+ async def compact_session(self, thread_id: str, config: dict[str, Any]) -> dict[str, Any]:
387
+ """Compact an existing native session using this build's client."""
388
+ await self._bootstrap_plugins_once()
389
+ await self._client.resume_thread(thread_id, config)
390
+ return await self._client.compact_thread(thread_id)
391
+
381
392
  async def close_all(self) -> None:
382
393
  """Dispose every thread and the activation-owned App Server process.
383
394
 
@@ -391,9 +402,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
391
402
  return
392
403
  self._closed = True
393
404
  threads = tuple(self._threads.values())
394
- active_threads = tuple(
395
- thread for thread in threads if thread.streaming and not thread.done
396
- )
405
+ active_threads = tuple(thread for thread in threads if thread.streaming and not thread.done)
397
406
  for thread in active_threads:
398
407
  thread.interrupt_event.set()
399
408
  try:
@@ -401,7 +410,10 @@ class CodexRuntimeAdapter(RuntimeAdapter):
401
410
  await self._client.interrupt_active_turn(thread.thread_id)
402
411
  finally:
403
412
  # AsyncCodex.close owns terminate/wait/kill for the app-server child.
404
- await self._client.close()
413
+ try:
414
+ await self._client.close()
415
+ finally:
416
+ self._turn_projector.close()
405
417
  thread_ids = {
406
418
  *self._known_threads,
407
419
  *self._threads,
@@ -439,13 +451,10 @@ class CodexRuntimeAdapter(RuntimeAdapter):
439
451
 
440
452
  request = thread.__dict__.get("_start_request")
441
453
  resume_state = thread.__dict__.get("_resume")
442
- if request is not None:
443
- prompt = _request_prompt(request)
444
- elif resume_state is not None:
445
- prompt = _resume_prompt(resume_state.get("payload"))
446
- else:
447
- prompt = ""
448
- run_input = _build_run_input(request, prompt)
454
+ projected = self._turn_projector.project(
455
+ request, resume_state.get("payload") if resume_state is not None else None,
456
+ )
457
+ run_input = projected.input
449
458
  thread.streaming = True
450
459
  thread.turn_id = thread.turn_id or f"turn_{thread.thread_id}"
451
460
  try:
@@ -480,14 +489,12 @@ class CodexRuntimeAdapter(RuntimeAdapter):
480
489
  ) -> AsyncIterator[RuntimeEvent]:
481
490
  request = thread.__dict__.get("_start_request") or thread.__dict__.get("_request_config")
482
491
  adapter = CodexEventAdapter(
483
- known_thread_ids=(thread.thread_id,)
484
- if thread.continuation_preexisting
485
- else (),
492
+ known_thread_ids=(thread.thread_id,) if thread.continuation_preexisting else (),
486
493
  )
487
494
  context = CodexAdapterContext(run_id=self._event_run_id(handle))
488
495
  run_config: dict[str, Any] = {"sandbox_read_only": self._sandbox_read_only}
489
496
  if request is not None and request.config:
490
- for key in ("sandbox", "approval_mode", "summary", "collaboration_mode"):
497
+ for key in ("sandbox", "approval_mode", "summary", "collaboration_mode", "effort"):
491
498
  value = request.config.get(key)
492
499
  if key == "approval_mode" and value == "manual":
493
500
  continue
@@ -554,8 +561,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
554
561
  # finish promptly, close the transport *before* awaiting
555
562
  # the waiter so MessageRouter.fail_all can release it.
556
563
  drain_deadline = (
557
- asyncio.get_running_loop().time()
558
- + _INTERRUPT_DRAIN_TIMEOUT_SECONDS
564
+ asyncio.get_running_loop().time() + _INTERRUPT_DRAIN_TIMEOUT_SECONDS
559
565
  )
560
566
  while True:
561
567
  drain_remaining = max(
@@ -599,9 +605,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
599
605
  # autoApprovalReview 不产生 canonical 事件(adapter 静默),但
600
606
  # cancel 级联丢弃审批的契约依赖 runtime 的 pending 跟踪。
601
607
  chunk_method = (
602
- str((chunk or {}).get("method") or "")
603
- if isinstance(chunk, dict)
604
- else ""
608
+ str((chunk or {}).get("method") or "") if isinstance(chunk, dict) else ""
605
609
  )
606
610
  if chunk_method in {
607
611
  "item/autoApprovalReview/started",
@@ -609,9 +613,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
609
613
  }:
610
614
  review_params = chunk.get("params") or {}
611
615
  review_id = str(
612
- review_params.get("reviewId")
613
- or review_params.get("review_id")
614
- or ""
616
+ review_params.get("reviewId") or review_params.get("review_id") or ""
615
617
  )
616
618
  if review_id:
617
619
  if chunk_method.endswith("started"):
@@ -685,9 +687,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
685
687
  framework="codex",
686
688
  native_run_id=handle.run_id,
687
689
  metadata={
688
- "agent_id": (
689
- str(request.agent_id or "codex") if request is not None else "codex"
690
- ),
690
+ "agent_id": (str(request.agent_id or "codex") if request is not None else "codex"),
691
691
  "user_id": (
692
692
  request.user_id
693
693
  if request is not None
@@ -712,8 +712,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
712
712
  "user_id": str(getattr(request, "user_id", "") or "user"),
713
713
  "session_id": str(getattr(request, "session_id", "") or ""),
714
714
  "invocation_id": str(
715
- (getattr(request, "metadata", None) or {}).get("invocation_id")
716
- or ""
715
+ (getattr(request, "metadata", None) or {}).get("invocation_id") or ""
717
716
  ),
718
717
  }
719
718
  merged = {**caller_scope, **dict(event.source.metadata or {})}
@@ -748,9 +747,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
748
747
  "source": self._make_source(handle),
749
748
  }
750
749
 
751
- def _make_run_canceled(
752
- self, handle: RunHandle, *, reason: str | None = None
753
- ) -> RunCanceled:
750
+ def _make_run_canceled(self, handle: RunHandle, *, reason: str | None = None) -> RunCanceled:
754
751
  framework = "codex"
755
752
  run_id = self._event_run_id(handle)
756
753
  scope_id = stable_scope_id(framework, run_id)
@@ -786,9 +783,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
786
783
  reason=reason,
787
784
  )
788
785
 
789
- def _make_run_failed(
790
- self, handle: RunHandle, error_message: str
791
- ) -> RunFailed:
786
+ def _make_run_failed(self, handle: RunHandle, error_message: str) -> RunFailed:
792
787
  framework = "codex"
793
788
  run_id = self._event_run_id(handle)
794
789
  scope_id = stable_scope_id(framework, run_id)
@@ -842,243 +837,6 @@ async def _anext_or_stop(gen: AsyncIterator[Any]) -> Any:
842
837
  return _STREAM_STOP
843
838
 
844
839
 
845
- def _resume_prompt(payload: Optional[ResumePayload]) -> Any:
846
- if payload is None:
847
- return ""
848
- if isinstance(payload.data, str):
849
- return payload.data
850
- return json.dumps(payload.data, ensure_ascii=False, sort_keys=True)
851
-
852
-
853
- def _coerce_prompt_text(value: Any) -> Any:
854
- """把 canonical message 形态的 input 压成 SDK 可接受的文本。
855
-
856
- ``openai-codex`` 0.147 的 run input 只接受 TextInput/str;请求侧没有
857
- conversation preprocessing 时 ``request.input`` 可能是
858
- ``[{role, content}]`` 历史列表,直接透传会 ``unsupported input item``。
859
- """
860
- if isinstance(value, str) or value is None:
861
- return value
862
- if isinstance(value, dict):
863
- content = value.get("content") if "role" in value else value.get("text")
864
- if isinstance(content, str):
865
- return content
866
- if isinstance(content, dict):
867
- text = content.get("text") or content.get("content")
868
- if isinstance(text, str):
869
- return text
870
- return str(value)
871
- if isinstance(value, list):
872
- texts = [
873
- text
874
- for text in (_coerce_prompt_text(item) for item in value)
875
- if isinstance(text, str) and text
876
- ]
877
- return "\n".join(texts) if texts else str(value)
878
- return str(value)
879
-
880
-
881
- def _request_prompt(request: StartRequest) -> Any:
882
- """Render canonical conversation history for a native Codex turn.
883
-
884
- 只传 user 消息历史 + 当前 input,不传 assistant 的完整回复(避免 codex 复述历史)。
885
- assistant 回复用简短摘要代替,仅维持对话结构。
886
- """
887
- # A resumed Codex thread already owns its transcript. Re-sending Studio's
888
- # transport-neutral history would duplicate every prior turn after refresh.
889
- if str(request.metadata.get("thread_id") or "").strip():
890
- return (
891
- request.input
892
- if _is_structured_turn_input(request.input)
893
- else _coerce_prompt_text(request.input)
894
- )
895
-
896
- conversation = request.conversation_preprocessing()
897
- if conversation is None or not conversation.messages:
898
- # Keep native text/image/mention parts intact for _build_run_input().
899
- # Flattening this list turns an image dict into user-visible text.
900
- return (
901
- request.input
902
- if _is_structured_turn_input(request.input)
903
- else _coerce_prompt_text(request.input)
904
- )
905
-
906
- lines: list[str] = []
907
- for message in conversation.messages:
908
- content = message.get("content")
909
- if not isinstance(content, str):
910
- continue
911
- role = str(message.get("role") or "user").strip().lower()
912
- if role == "assistant":
913
- # 不传完整回复,只标注"已回复",避免 codex 复述
914
- summary = content[:80] + ("..." if len(content) > 80 else "")
915
- lines.append(f"[上一轮已回复: {summary}]")
916
- elif role == "user":
917
- lines.append(f"User: {content}")
918
- return "\n".join(lines) or request.input
919
-
920
-
921
- def _is_structured_turn_input(value: Any) -> bool:
922
- return isinstance(value, list) and any(
923
- isinstance(item, dict) and isinstance(item.get("type"), str)
924
- for item in value
925
- )
926
-
927
-
928
- def _build_run_input(request: Optional[StartRequest], prompt: Any) -> Any:
929
- """Compose Codex skills and native text/image/mention turn input."""
930
- try:
931
- from openai_codex import ImageInput, LocalImageInput, MentionInput, SkillInput, TextInput
932
- except ImportError:
933
- return prompt
934
- skills: list[SkillInput] = []
935
- if request is not None:
936
- raw = request.config.get("skills") if request.config else None
937
- if isinstance(raw, list):
938
- for item in raw:
939
- if not isinstance(item, dict):
940
- continue
941
- name = str(item.get("name") or "").strip()
942
- path = str(item.get("path") or "").strip()
943
- if name and path:
944
- skills.append(SkillInput(name=name, path=path))
945
- native_items: list[Any] = []
946
- raw_input = request.input if request is not None else prompt
947
- if isinstance(raw_input, list):
948
- text_replaced = False
949
- for item in raw_input:
950
- if not isinstance(item, dict):
951
- continue
952
- kind = str(item.get("type") or "")
953
- if not kind and "role" in item:
954
- # canonical conversation message({role, content});当前 input
955
- # 已由 prompt(或 conversation preprocessing)承载,跳过历史项。
956
- continue
957
- if kind in {"text", "input_text"}:
958
- text = str(
959
- prompt
960
- if not text_replaced and isinstance(prompt, str)
961
- else item.get("text") or ""
962
- )
963
- text_replaced = True
964
- if text:
965
- native_items.append(TextInput(text=text))
966
- elif kind in {"image", "input_image"} and (
967
- item.get("url") or item.get("image_url")
968
- ):
969
- native_items.append(
970
- ImageInput(url=str(item.get("url") or item.get("image_url")))
971
- )
972
- elif kind == "localImage" and item.get("path"):
973
- native_items.append(LocalImageInput(path=str(item["path"])))
974
- elif kind == "input_file" and (
975
- item.get("file_data")
976
- or str(item.get("file_url") or "").startswith("data:")
977
- ):
978
- file_path = _materialize_inline_file(
979
- str(item.get("file_data") or item.get("file_url")),
980
- str(item.get("filename") or "attachment"),
981
- )
982
- if file_path is not None:
983
- # App Server's ``mention`` input is presentation metadata:
984
- # current Codex versions do not include it in the model's
985
- # user message. Always add an explicit model-visible
986
- # attachment context as well. Small textual files are
987
- # inlined deterministically; binary/large files expose a
988
- # sandbox-readable path that Codex can inspect with tools.
989
- native_items.append(
990
- TextInput(text=_attachment_context_text(file_path, item))
991
- )
992
- native_items.append(
993
- MentionInput(name=file_path.name, path=str(file_path))
994
- )
995
- elif kind == "mention" and item.get("path"):
996
- native_items.append(
997
- MentionInput(
998
- name=str(item.get("name") or item["path"]),
999
- path=str(item["path"]),
1000
- )
1001
- )
1002
- else:
1003
- text = prompt if isinstance(prompt, str) else str(prompt or "")
1004
- if text:
1005
- native_items.append(TextInput(text=text))
1006
- combined = [*skills, *native_items]
1007
- if not combined:
1008
- return prompt
1009
- if len(combined) == 1 and isinstance(combined[0], TextInput) and not skills:
1010
- return combined[0].text
1011
- return combined
1012
-
1013
-
1014
- def _materialize_inline_file(data_url: str, filename: str) -> Path | None:
1015
- """Materialize a bounded Studio inline attachment for native Codex."""
1016
-
1017
- match = re.fullmatch(r"data:([^;,]+)?;base64,([A-Za-z0-9+/=\s]+)", data_url)
1018
- encoded = match.group(2) if match is not None else data_url.strip()
1019
- try:
1020
- payload = base64.b64decode(encoded, validate=True)
1021
- except (ValueError, binascii.Error):
1022
- return None
1023
- if not payload or len(payload) > 10 * 1024 * 1024:
1024
- return None
1025
- safe_name = re.sub(r"[^A-Za-z0-9._-]+", "-", Path(filename).name).strip(".-")
1026
- safe_name = safe_name[:120] or "attachment"
1027
- digest = hashlib.sha256(payload).hexdigest()
1028
- path = Path("/tmp/ksadk-codex-attachments") / digest / safe_name
1029
- path.parent.mkdir(parents=True, exist_ok=True)
1030
- if not path.exists():
1031
- path.write_bytes(payload)
1032
- return path
1033
-
1034
-
1035
- _MAX_INLINE_ATTACHMENT_TEXT_BYTES = 64 * 1024
1036
- _TEXT_ATTACHMENT_SUFFIXES = {
1037
- ".csv",
1038
- ".html",
1039
- ".htm",
1040
- ".ini",
1041
- ".json",
1042
- ".jsonl",
1043
- ".log",
1044
- ".md",
1045
- ".py",
1046
- ".rst",
1047
- ".toml",
1048
- ".tsv",
1049
- ".txt",
1050
- ".xml",
1051
- ".yaml",
1052
- ".yml",
1053
- }
1054
-
1055
-
1056
- def _attachment_context_text(path: Path, item: Mapping[str, Any]) -> str:
1057
- """Build model-visible context for a materialized Responses input file."""
1058
-
1059
- name = str(item.get("filename") or path.name).replace('"', "'")
1060
- inline_data = item.get("inlineData")
1061
- inline_mime = inline_data.get("mimeType") if isinstance(inline_data, Mapping) else None
1062
- mime_type = str(item.get("mime_type") or inline_mime or "").strip().lower()
1063
- source = str(item.get("file_data") or item.get("file_url") or "")
1064
- data_url_match = re.match(r"data:([^;,]+)", source)
1065
- if not mime_type and data_url_match is not None:
1066
- mime_type = data_url_match.group(1).strip().lower()
1067
- is_text = mime_type.startswith("text/") or path.suffix.lower() in _TEXT_ATTACHMENT_SUFFIXES
1068
- header = f'<uploaded_attachment name="{name}" path="{path}">'
1069
- if not is_text:
1070
- return (
1071
- f"{header}\n"
1072
- "The uploaded file is available at the path above. Read it with an appropriate "
1073
- "tool before answering questions about its contents.\n"
1074
- "</uploaded_attachment>"
1075
- )
1076
-
1077
- raw = path.read_bytes()
1078
- truncated = len(raw) > _MAX_INLINE_ATTACHMENT_TEXT_BYTES
1079
- text = raw[:_MAX_INLINE_ATTACHMENT_TEXT_BYTES].decode("utf-8", errors="replace")
1080
- suffix = "\n[attachment content truncated]" if truncated else ""
1081
- return f"{header}\n{text}{suffix}\n</uploaded_attachment>"
1082
840
 
1083
841
 
1084
842
  __all__ = ["CodexRuntimeAdapter"]
ksadk/common/auth.py CHANGED
@@ -49,6 +49,8 @@ class AWSV4Auth:
49
49
  secret_access_key: str = "",
50
50
  region: str = "cn-beijing-6",
51
51
  service: str = "aicp",
52
+ *,
53
+ allow_env_fallback: bool = True,
52
54
  ):
53
55
  """初始化签名器
54
56
 
@@ -57,17 +59,21 @@ class AWSV4Auth:
57
59
  secret_access_key: 访问密钥 (SK),默认从环境变量读取
58
60
  region: 区域 ID (如 cn-beijing-6)
59
61
  service: 服务名称 (如 kmr, aicp, iam 等)
62
+ allow_env_fallback: 显式运行时连接设为 False,禁止继承宿主凭证
60
63
  """
61
- self.access_key_id = (
62
- access_key_id
63
- or os.environ.get("KSYUN_ACCESS_KEY")
64
- or os.environ.get("KS3_ACCESS_KEY", "")
65
- )
66
- self.secret_access_key = (
67
- secret_access_key
68
- or os.environ.get("KSYUN_SECRET_KEY")
69
- or os.environ.get("KS3_SECRET_KEY", "")
70
- )
64
+ self.access_key_id = access_key_id
65
+ self.secret_access_key = secret_access_key
66
+ if allow_env_fallback:
67
+ self.access_key_id = (
68
+ self.access_key_id
69
+ or os.environ.get("KSYUN_ACCESS_KEY")
70
+ or os.environ.get("KS3_ACCESS_KEY", "")
71
+ )
72
+ self.secret_access_key = (
73
+ self.secret_access_key
74
+ or os.environ.get("KSYUN_SECRET_KEY")
75
+ or os.environ.get("KS3_SECRET_KEY", "")
76
+ )
71
77
  self.region = region
72
78
  self.service = service
73
79
 
@@ -369,6 +369,12 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
369
369
  sensitive=True,
370
370
  ),
371
371
  EnvVarSpec("KSADK_KB_TOP_K", "knowledge_base", "Knowledge-base retrieval result count.", "5"),
372
+ EnvVarSpec(
373
+ "KSADK_CHECKPOINT_DSN",
374
+ "sessions",
375
+ "Framework-agnostic PostgreSQL checkpoint DSN.",
376
+ sensitive=True,
377
+ ),
372
378
  EnvVarSpec(
373
379
  "KSADK_LANGGRAPH_CHECKPOINT_DSN",
374
380
  "sessions",
@@ -384,6 +390,11 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
384
390
  ),
385
391
  "false",
386
392
  ),
393
+ EnvVarSpec(
394
+ "KSADK_LANGGRAPH_POSTGRES_REQUIREMENTS",
395
+ "builders",
396
+ "Internal bundled LangGraph PostgreSQL checkpointer requirement constant.",
397
+ ),
387
398
  EnvVarSpec(
388
399
  "KSADK_LOCAL_SKILLS_DIR", "skills", "Local directory containing extracted Skill packages."
389
400
  ),
@@ -461,6 +472,18 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
461
472
  "model_proxy",
462
473
  "Comma-separated model allowlist for the experimental model proxy.",
463
474
  ),
475
+ EnvVarSpec(
476
+ "KSADK_PERSISTENCE_PROBE_CACHE_TTL",
477
+ "sessions",
478
+ "PostgreSQL persistence readiness cache TTL seconds.",
479
+ "30",
480
+ ),
481
+ EnvVarSpec(
482
+ "KSADK_PERSISTENCE_PROBE_TIMEOUT",
483
+ "sessions",
484
+ "PostgreSQL persistence readiness timeout seconds.",
485
+ "2",
486
+ ),
464
487
  EnvVarSpec("KSADK_PG_EVENTS_TABLE", "sessions", "Internal PostgreSQL events table constant."),
465
488
  EnvVarSpec(
466
489
  "KSADK_PG_SESSIONS_TABLE", "sessions", "Internal PostgreSQL sessions table constant."
@@ -498,6 +521,11 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
498
521
  "skills",
499
522
  "Comma-separated public Skill Space ids appended after user spaces.",
500
523
  ),
524
+ EnvVarSpec(
525
+ "KSADK_RESOURCE_IAM_ENDPOINT",
526
+ "platform_resources",
527
+ "Operator-owned IAM endpoint used to authorize Studio platform-resource bindings.",
528
+ ),
501
529
  EnvVarSpec(
502
530
  "KSADK_RESPONSES_SESSION_HEADER",
503
531
  "runners",
@@ -838,7 +866,7 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
838
866
  "KSADK_WEB_VERSION",
839
867
  "web",
840
868
  "Published KsADK Web npm version used for a reproducible wheel build.",
841
- "0.3.4",
869
+ "0.3.7",
842
870
  ),
843
871
  EnvVarSpec(
844
872
  "KSADK_WORKING_SET_MAX_FILES",