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
@@ -8,15 +8,19 @@ from typing import Any, Literal, NoReturn, cast
8
8
 
9
9
  from pydantic import JsonValue
10
10
 
11
- _CODEX_ERROR_INFO_VALUES = frozenset("""
11
+ _CODEX_ERROR_INFO_VALUES = frozenset(
12
+ """
12
13
  contextWindowExceeded sessionBudgetExceeded usageLimitExceeded serverOverloaded
13
14
  cyberPolicy internalServerError unauthorized badRequest threadRollbackFailed
14
15
  sandboxError other
15
- """.split())
16
- _CODEX_ERROR_INFO_VARIANTS = frozenset("""
16
+ """.split()
17
+ )
18
+ _CODEX_ERROR_INFO_VARIANTS = frozenset(
19
+ """
17
20
  httpConnectionFailed responseStreamConnectionFailed responseStreamDisconnected
18
21
  responseTooManyFailedAttempts activeTurnNotSteerable
19
- """.split())
22
+ """.split()
23
+ )
20
24
 
21
25
 
22
26
  class CodexMappingError(ValueError):
@@ -151,16 +155,23 @@ def _question_schema(
151
155
  )
152
156
  )
153
157
  option_details.append(_json_value(option))
158
+ multiple = bool(question.get("isMultiSelect", False))
159
+ allow_other = bool(question.get("isOther", False))
154
160
  property_schema: dict[str, JsonValue] = {
155
- "type": "string",
161
+ "type": "array" if multiple else "string",
156
162
  "title": header,
157
163
  "description": prompt,
158
164
  "x-codex-options": option_details,
159
165
  "x-codex-is-secret": is_secret,
160
166
  "x-codex-is-other": bool(question.get("isOther", False)),
161
167
  }
162
- if labels:
163
- property_schema["enum"] = cast(JsonValue, labels)
168
+ value_schema: dict[str, JsonValue] = {"type": "string", "minLength": 1}
169
+ if labels and not allow_other:
170
+ value_schema["enum"] = cast(JsonValue, labels)
171
+ if multiple:
172
+ property_schema.update({"items": value_schema, "minItems": 1, "uniqueItems": True})
173
+ else:
174
+ property_schema.update(value_schema)
164
175
  properties[question_id] = property_schema
165
176
  required.append(question_id)
166
177
  prompts.append(prompt)
@@ -87,6 +87,7 @@ class LangGraphEventAdapter:
87
87
  def __init__(self) -> None:
88
88
  self._messages: dict[tuple[str, str], _MessageState] = {}
89
89
  self._tools: dict[tuple[str, str], _ToolState] = {}
90
+ self._tool_occurrences: dict[tuple[str, str], int] = {}
90
91
  self._lifecycles: dict[str, _LifecycleState] = {}
91
92
 
92
93
  async def stream_run(
@@ -331,7 +332,20 @@ class LangGraphEventAdapter:
331
332
  f"LangGraph tool call {call_id!r} started twice",
332
333
  )
333
334
  name = _required_string(payload.get("tool_name"), "tools tool_name")
334
- item_id = stable_item_id("langgraph", frame.scope_id, "tool_result", call_id)
335
+ occurrence = self._tool_occurrences.get(state_key, 0)
336
+ self._tool_occurrences[state_key] = occurrence + 1
337
+ item_id = (
338
+ stable_item_id("langgraph", frame.scope_id, "tool_result", call_id)
339
+ if occurrence == 0
340
+ else stable_item_id(
341
+ "langgraph",
342
+ frame.scope_id,
343
+ "tool_result",
344
+ call_id,
345
+ "occurrence",
346
+ frame.occurrence_key,
347
+ )
348
+ )
335
349
  self._tools[state_key] = _ToolState(
336
350
  scope_id=frame.scope_id,
337
351
  parent_scope_id=frame.parent_scope_id,
@@ -158,7 +158,9 @@ class RuntimeEventStore:
158
158
  self._typed_session_id = session_id
159
159
  else:
160
160
  self._event_store = None
161
- self._service = store
161
+ # A live-first session wrapper may expose one durable authority for
162
+ # canonical facts without claiming that its dual writes are atomic.
163
+ self._service = getattr(store, "canonical_event_service", store)
162
164
  self._typed_session_id = session_id
163
165
 
164
166
  @property
@@ -23,7 +23,7 @@ canonical store(``ksadk/events/canonical_store.py`` 及 ``canonical.py`` 的
23
23
  | Responses 历史 | ``conversations/context.py::project_responses_history`` | Responses API 请求回放 input | OpenAI Responses input items(``type``/``call_id``/``output``/role 消息),仅可靠 call_id 的 tool 项 |
24
24
  | 模型 history | ``conversations/context.py::project_model_messages`` | 运行时模型上下文(内部投喂) | ``role``/``content`` 消息列表;control 事件不进入上下文 |
25
25
  | server checkpoint payload | ``server/routes/projection.py::_checkpoint_event_to_action_payload`` | REST 断点续跑/预览接口 | ``EventId``/``SessionId``/``RunId``/``CheckpointId``/``Framework``/``FrameworkRef``/``IsResumable``/``ResumeStatus``/``IsTerminal``/``NextNode``(经 ``run_checkpoint`` 元数据或 ``continuation.created`` 投影) |
26
- | server 动作事件 payload | ``server/routes/projection.py::_event_to_action_payload`` | REST 会话动作接口(事件原始形态透传) | ``EventId``/``SessionId``/``Author``/``EventType``/``Content``/``Timestamp``/``SeqId``(可选 ``InvocationId``)——序列化存储形态本身,非 canonical 派生 |
26
+ | server 动作事件 payload | ``server/routes/projection.py::_event_to_action_payload`` | REST 会话动作接口(事件原始形态透传) | ``EventId``/``SessionId``/``Author``/``EventType``/``Content``/``Timestamp``/``SeqId``(可选 ``InvocationId``)——序列化存储形态本身,非 canonical 派生;canonical runtime 事件额外注入 ``Content.parts[0].text`` 兼容旧前端 |
27
27
 
28
28
  内部不保证(任何投影都不承诺、消费方不得依赖):
29
29
  - ``seq``/``run_seq`` 的具体数值与连续性(仅保序语义);
ksadk/harness/config.py CHANGED
@@ -41,8 +41,8 @@ class McpToolSpec:
41
41
  """MCP 工具条目(最小子集)。"""
42
42
 
43
43
  name: str
44
- url: str
45
- api_key: Optional[str] = None
44
+ url: str = field(repr=False)
45
+ api_key: Optional[str] = field(default=None, repr=False)
46
46
  tool_filter: tuple[str, ...] = ()
47
47
  tool_name_prefix: Optional[str] = None
48
48
 
ksadk/harness/runtime.py CHANGED
@@ -109,6 +109,8 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
109
109
  self._tool_lock = asyncio.Lock()
110
110
  self._mcp_toolsets: list[Any] = []
111
111
  self._sessions: dict[tuple[str, str, str], _HarnessSession] = {}
112
+ self._lifecycle_lock = asyncio.Lock()
113
+ self._closed = False
112
114
 
113
115
  @property
114
116
  def harness_config(self) -> HarnessConfig:
@@ -123,10 +125,13 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
123
125
  return self._sandbox.workspace_root
124
126
 
125
127
  async def start(self, request: StartRequest) -> RunHandle:
126
- run_id = str(request.metadata.get("invocation_id") or f"harness_{uuid.uuid4().hex}")
127
- if run_id in self._runs:
128
- raise ValueError(f"duplicate Harness invocation: {run_id}")
129
- self._runs[run_id] = _HarnessRun(request=request)
128
+ async with self._lifecycle_lock:
129
+ if self._closed:
130
+ raise RuntimeError("Harness runtime adapter is closed")
131
+ run_id = str(request.metadata.get("invocation_id") or f"harness_{uuid.uuid4().hex}")
132
+ if run_id in self._runs:
133
+ raise ValueError(f"duplicate Harness invocation: {run_id}")
134
+ self._runs[run_id] = _HarnessRun(request=request)
130
135
  return RunHandle(
131
136
  run_id=run_id,
132
137
  session_id=request.session_id,
@@ -174,28 +179,29 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
174
179
  )
175
180
 
176
181
  async def close(self, handle: RunHandle) -> None:
177
- run = self._runs.pop(handle.run_id, None)
182
+ async with self._lifecycle_lock:
183
+ run = self._runs.pop(handle.run_id, None)
184
+ has_runs = bool(self._runs)
178
185
  if run is not None and run.task is not None and not run.task.done():
179
186
  run.task.cancel()
180
187
  await asyncio.gather(run.task, return_exceptions=True)
181
- if not self._runs:
188
+ if not has_runs:
182
189
  await self._close_tools()
183
190
 
184
191
  async def close_all(self) -> None:
185
192
  """Dispose every process-local run owned by this adapter instance."""
186
193
 
187
- for run_id, run in list(self._runs.items()):
188
- await self.close(
189
- RunHandle(
190
- run_id=run_id,
191
- session_id=run.request.session_id,
192
- runtime_type="harness",
193
- native_ref={
194
- "user_id": run.request.user_id,
195
- "agent_id": run.request.agent_id,
196
- },
197
- )
198
- )
194
+ async with self._lifecycle_lock:
195
+ self._closed = True
196
+ runs = tuple(self._runs.values())
197
+ self._runs.clear()
198
+ self._sessions.clear()
199
+ tasks = [run.task for run in runs if run.task is not None and not run.task.done()]
200
+ for task in tasks:
201
+ task.cancel()
202
+ if tasks:
203
+ await asyncio.gather(*tasks, return_exceptions=True)
204
+ await self._close_tools()
199
205
 
200
206
  def is_handle_attached(self, handle: RunHandle) -> bool:
201
207
  return handle.run_id in self._runs
@@ -305,9 +311,7 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
305
311
 
306
312
  def _effective(self, request: StartRequest) -> tuple[str, str]:
307
313
  metadata = request.metadata or {}
308
- model = str(
309
- metadata.get("model_override") or request.model or self._config.model
310
- ).strip()
314
+ model = str(metadata.get("model_override") or request.model or self._config.model).strip()
311
315
  prompt = str(
312
316
  metadata.get("prompt_override")
313
317
  or request.config.get("base_instructions")
@@ -344,9 +348,7 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
344
348
  },
345
349
  )
346
350
 
347
- def env_kwargs(
348
- item_id: str, event_type: str, part_id: str
349
- ) -> dict[str, Any]:
351
+ def env_kwargs(item_id: str, event_type: str, part_id: str) -> dict[str, Any]:
350
352
  n = next_seq()
351
353
  return {
352
354
  "schema_version": 2,
@@ -445,9 +447,7 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
445
447
  **env_kwargs(message_item_id, "item.completed", "text-0"),
446
448
  item_id=message_item_id,
447
449
  item_kind="message",
448
- snapshot=ContentSnapshot(
449
- parts=(TextContent(part_id="text-0", text=text),)
450
- ),
450
+ snapshot=ContentSnapshot(parts=(TextContent(part_id="text-0", text=text),)),
451
451
  )
452
452
  run.done = True
453
453
  yield RunCompleted(
ksadk/harness/tools.py CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import asyncio
5
6
  import json
6
7
  import uuid
7
8
  from dataclasses import dataclass
@@ -14,6 +15,13 @@ from ksadk.mcp_runtime import MCPServerConfig, build_mcp_toolset
14
15
 
15
16
  ToolHandler = Callable[[dict[str, Any], str | None], Awaitable[Any]]
16
17
 
18
+ HARNESS_SANDBOX_TOOL_NAMES = frozenset(
19
+ {
20
+ "sandbox_read_file",
21
+ "sandbox_run_command",
22
+ }
23
+ )
24
+
17
25
 
18
26
  @dataclass(frozen=True)
19
27
  class HarnessTool:
@@ -89,11 +97,25 @@ async def load_mcp_tools(spec: McpToolSpec) -> tuple[Any, list[HarnessTool]]:
89
97
  toolset = build_mcp_toolset(config)
90
98
  try:
91
99
  native_tools = await toolset.get_tools_with_prefix()
92
- except Exception as exc:
93
- await toolset.close()
100
+ except BaseException as error:
101
+ cleanup = asyncio.create_task(toolset.close())
102
+ interrupted = False
103
+ while not cleanup.done():
104
+ try:
105
+ await asyncio.shield(cleanup)
106
+ except asyncio.CancelledError:
107
+ interrupted = True
108
+ try:
109
+ cleanup.result()
110
+ except Exception:
111
+ pass
112
+ if interrupted or isinstance(error, asyncio.CancelledError):
113
+ raise asyncio.CancelledError
114
+ if not isinstance(error, Exception):
115
+ raise
94
116
  raise RuntimeError(
95
- f"Harness MCP server {spec.name!r} at {spec.url!r} failed to start: {exc}"
96
- ) from exc
117
+ f"Harness MCP server {spec.name!r} at {spec.url} failed to start"
118
+ ) from None
97
119
 
98
120
  available_names = {str(tool.name) for tool in native_tools}
99
121
  expected_names = {
@@ -104,14 +126,11 @@ async def load_mcp_tools(spec: McpToolSpec) -> tuple[Any, list[HarnessTool]]:
104
126
  if missing_names:
105
127
  await toolset.close()
106
128
  raise RuntimeError(
107
- f"Harness MCP server {spec.name!r} at {spec.url!r} did not expose configured "
108
- f"tool(s): {missing_names}"
129
+ f"Harness MCP server {spec.name!r} did not expose configured tool(s): {missing_names}"
109
130
  )
110
131
  if not native_tools:
111
132
  await toolset.close()
112
- raise RuntimeError(
113
- f"Harness MCP server {spec.name!r} at {spec.url!r} exposed no callable tools"
114
- )
133
+ raise RuntimeError(f"Harness MCP server {spec.name!r} exposed no callable tools")
115
134
 
116
135
  tools: list[HarnessTool] = []
117
136
  for native_tool in native_tools:
@@ -139,10 +158,10 @@ async def load_mcp_tools(spec: McpToolSpec) -> tuple[Any, list[HarnessTool]]:
139
158
  context = await _new_tool_context(call_id or _tool_name)
140
159
  result = await _native_tool.run_async(args=arguments, tool_context=context)
141
160
  return _normalize_tool_result(result, context)
142
- except Exception as exc:
161
+ except Exception:
143
162
  raise RuntimeError(
144
- f"Harness MCP tool {_tool_name!r} on server {spec.name!r} failed: {exc}"
145
- ) from exc
163
+ f"Harness MCP tool {_tool_name!r} on server {spec.name!r} failed"
164
+ ) from None
146
165
 
147
166
  tools.append(
148
167
  HarnessTool(
@@ -219,4 +238,10 @@ def _normalize_json_schema(value: Any) -> Any:
219
238
  return value
220
239
 
221
240
 
222
- __all__ = ["HarnessTool", "load_mcp_tools", "sandbox_tools", "tool_result_text"]
241
+ __all__ = [
242
+ "HARNESS_SANDBOX_TOOL_NAMES",
243
+ "HarnessTool",
244
+ "load_mcp_tools",
245
+ "sandbox_tools",
246
+ "tool_result_text",
247
+ ]
@@ -44,6 +44,7 @@ class InteractionResolveContext:
44
44
  handle: RunHandle
45
45
  activation_id: str
46
46
  fencing_token: int
47
+ session_context: dict | None = None
47
48
 
48
49
 
49
50
  @runtime_checkable
@@ -47,6 +47,7 @@ class LangGraphInteractionProvider:
47
47
  kind=payload_kind,
48
48
  call_id=str(native_target.get("call_id") or record.interaction_id),
49
49
  data=submission.response,
50
+ session_context=context.session_context,
50
51
  )
51
52
  return await context.adapter.resume(
52
53
  context.handle,
ksadk/kernel/bootstrap.py CHANGED
@@ -39,7 +39,7 @@ from ksadk.kernel.contract_fingerprints import (
39
39
  )
40
40
  from ksadk.kernel.contracts import RuntimeCapabilityMatrix
41
41
  from ksadk.kernel.control import AgentKernel, default_capability_matrix
42
- from ksadk.kernel.errors import InvalidCommandError
42
+ from ksadk.kernel.errors import InvalidCommandError, StaleFenceError
43
43
  from ksadk.kernel.recovery import RecoveryCoordinator
44
44
  from ksadk.kernel.runtime_identity import runtime_identity
45
45
  from ksadk.kernel.store import AgentKernelStore, now_utc
@@ -465,8 +465,25 @@ class AgentKernelRuntime:
465
465
  lease,
466
466
  session_id=session_id,
467
467
  )
468
- if result.outcome != "idle":
468
+ if result.outcome in {"claimed", "completed"}:
469
469
  progressed = True
470
+ elif result.outcome == "terminal_failure":
471
+ if isinstance(result.error, StaleFenceError):
472
+ # 当前 activation 已失去 fence,不能继续触碰该
473
+ # session,也不应把正常 takeover 误判为坏数据。
474
+ self._heartbeat_sessions.discard(session_id)
475
+ self._last_renewed.pop(session_id, None)
476
+ self.lease_heartbeat.forget(session_id)
477
+ continue
478
+ failure = result.error or RuntimeError(
479
+ "agent kernel command failed without an error detail"
480
+ )
481
+ if not await self._quarantine_session(
482
+ session_id,
483
+ failure,
484
+ context="command execution",
485
+ ):
486
+ return
470
487
  self._store_failures = 0
471
488
  except asyncio.CancelledError:
472
489
  raise
@@ -609,7 +626,13 @@ class AgentKernelRuntime:
609
626
  return False
610
627
  return True
611
628
 
612
- async def _quarantine_session(self, session_id: str, exc: Exception) -> bool:
629
+ async def _quarantine_session(
630
+ self,
631
+ session_id: str,
632
+ exc: Exception,
633
+ *,
634
+ context: str = "takeover recovery",
635
+ ) -> bool:
613
636
  """隔离一个恢复失败的 session;返回 False 表示已触发进程级降级。
614
637
 
615
638
  被隔离的 session 不再被本 runtime claim / 恢复 / 续约,其 inbox
@@ -631,9 +654,10 @@ class AgentKernelRuntime:
631
654
  self._last_renewed.pop(session_id, None)
632
655
  self.lease_heartbeat.forget(session_id)
633
656
  logger.warning(
634
- "agent kernel session %s quarantined after takeover recovery "
657
+ "agent kernel session %s quarantined after %s "
635
658
  "failed: agent_instance_id=%s error=%s: %s",
636
659
  session_id,
660
+ context,
637
661
  self.config.agent_instance_id,
638
662
  type(exc).__name__,
639
663
  exc,
ksadk/kernel/ingress.py CHANGED
@@ -94,9 +94,22 @@ def get_agent_kernel() -> Any | None:
94
94
 
95
95
 
96
96
  def kernel_route_active() -> bool:
97
- """当前请求是否走 kernel ingress(开关开 且 kernel 已注册)。"""
97
+ """Whether public compatibility routes may self-admit through the kernel.
98
+
99
+ A hosted Runtime accepts AgentControl commands only with a permit issued by
100
+ Server. The public ``/v1/responses`` / legacy ``RunAgent`` routes do not
101
+ carry that permit, so routing them through ``trusted_context`` would create
102
+ a process-local signature that the hosted verifier must reject. Keep those
103
+ authenticated compatibility routes on their established executor path;
104
+ Server continues to use the dedicated ``/agent-kernel/v1/*`` ingress, which
105
+ validates the Server-issued permit independently of this selector.
106
+ """
98
107
 
99
- return kernel_ingress_enabled() and get_agent_kernel() is not None
108
+ return (
109
+ kernel_ingress_enabled()
110
+ and get_agent_kernel() is not None
111
+ and authority_mode() != _AUTHORITY_HOSTED
112
+ )
100
113
 
101
114
 
102
115
  # ---------------------------------------------------------------------------
@@ -1112,6 +1112,33 @@ class SQLiteAgentKernelStore:
1112
1112
  )
1113
1113
  return self._row_to_record(rows[0]) if rows else None
1114
1114
 
1115
+ async def get_terminal_receipt(
1116
+ self, interaction_id: str, *, tenant_id: str, agent_instance_id: str,
1117
+ session_id: str, run_id: str,
1118
+ ) -> InteractionReceipt | None:
1119
+ """Read the committed outcome inside a complete trusted scope.
1120
+
1121
+ Resolved alone does not mean approved. Pending/resolving records never
1122
+ yield an authorization receipt; callers must still match the request.
1123
+ """
1124
+ if not all(isinstance(value, str) and value for value in (
1125
+ interaction_id, tenant_id, agent_instance_id, session_id, run_id
1126
+ )):
1127
+ raise InvalidCommandError("interaction receipt requires a complete trusted scope")
1128
+ row = await self._fetchone(
1129
+ await self._connect(),
1130
+ "SELECT * FROM kernel_interactions WHERE interaction_id=? AND tenant_id=?"
1131
+ " AND agent_instance_id=? AND session_id=? AND run_id=?",
1132
+ (interaction_id, tenant_id, agent_instance_id, session_id, run_id),
1133
+ )
1134
+ if row is None or not is_terminal(row["status"]):
1135
+ return None
1136
+ return InteractionReceipt(
1137
+ interaction_id=row["interaction_id"], revision=int(row["revision"]),
1138
+ status=row["status"], outcome=row["outcome"], event_id=row["event_id"],
1139
+ accepted_seq=row["accepted_seq"],
1140
+ )
1141
+
1115
1142
  async def list_pending_interactions(
1116
1143
  self, tenant_id: str, session_id: str
1117
1144
  ) -> list[InteractionRecord]:
ksadk/kernel/store.py CHANGED
@@ -54,6 +54,9 @@ def command_digest(command: AgentControlCommand) -> str:
54
54
  canonical["source"] = source
55
55
 
56
56
  payload = dict(canonical.get("payload") or {})
57
+ # Admission derives this immutable snapshot from the current session. A
58
+ # retry after a tag update must still resolve to the first accepted command.
59
+ payload.pop("session_context", None)
57
60
  if command.command_type == "submit_interaction":
58
61
  payload.pop("token_ref", None)
59
62
  canonical["payload"] = payload
ksadk/kernel/worker.py CHANGED
@@ -109,6 +109,7 @@ class WorkResult:
109
109
  message_id: str | None = None
110
110
  run_id: str | None = None
111
111
  last_seq: int | None = None
112
+ error: Exception | None = None
112
113
 
113
114
 
114
115
  class AgentKernelWorker:
@@ -294,8 +295,10 @@ class AgentKernelWorker:
294
295
  )
295
296
  await self._store.discard_claim(message_id, expected_fence=fence)
296
297
  return WorkResult(outcome="completed", message_id=message_id)
297
- except StaleFenceError:
298
- return WorkResult(outcome="terminal_failure", message_id=message_id)
298
+ except StaleFenceError as error:
299
+ return WorkResult(
300
+ outcome="terminal_failure", message_id=message_id, error=error
301
+ )
299
302
  except AgentKernelError as error:
300
303
  if error.code == RUNTIME_INTERACTION_UNAVAILABLE:
301
304
  # typed rejection:provider 诚实声明无法原生送达回包,
@@ -316,16 +319,46 @@ class AgentKernelWorker:
316
319
  await self._store.discard_claim(message_id, expected_fence=fence)
317
320
  return WorkResult(outcome="completed", message_id=message_id)
318
321
  if error.retryable:
319
- return WorkResult(outcome="retryable_failure", message_id=message_id)
320
- return WorkResult(outcome="terminal_failure", message_id=message_id)
321
- except Exception:
322
+ return WorkResult(
323
+ outcome="retryable_failure", message_id=message_id, error=error
324
+ )
325
+ logger.error(
326
+ "agent kernel command failed permanently: "
327
+ "agent_instance_id=%s session_id=%s command_id=%s "
328
+ "command_type=%s error=%s: %s",
329
+ command.agent_instance_id,
330
+ command.session_id,
331
+ command.command_id,
332
+ command.command_type,
333
+ type(error).__name__,
334
+ error,
335
+ )
336
+ return WorkResult(
337
+ outcome="terminal_failure", message_id=message_id, error=error
338
+ )
339
+ except Exception as error:
322
340
  # 未知异常绝不 ack 为成功:消息保持 claimed。
323
- return WorkResult(outcome="terminal_failure", message_id=message_id)
341
+ logger.exception(
342
+ "agent kernel command raised an unexpected exception: "
343
+ "agent_instance_id=%s session_id=%s command_id=%s "
344
+ "command_type=%s error=%s: %s",
345
+ command.agent_instance_id,
346
+ command.session_id,
347
+ command.command_id,
348
+ command.command_type,
349
+ type(error).__name__,
350
+ error,
351
+ )
352
+ return WorkResult(
353
+ outcome="terminal_failure", message_id=message_id, error=error
354
+ )
324
355
 
325
356
  try:
326
357
  await self._store.complete_claim(message_id, expected_fence=fence)
327
- except StaleFenceError:
328
- return WorkResult(outcome="terminal_failure", message_id=message_id)
358
+ except StaleFenceError as error:
359
+ return WorkResult(
360
+ outcome="terminal_failure", message_id=message_id, error=error
361
+ )
329
362
  return WorkResult(outcome="completed", message_id=message_id, run_id=run_id)
330
363
 
331
364
  async def _message_id_for(self, command: AgentControlCommand) -> str:
@@ -407,6 +440,11 @@ class AgentKernelWorker:
407
440
  # durable run_id 优先传给 adapter;adapter 不认时以
408
441
  # runtime_run_id 映射显式记录两个 ID 的对应关系。
409
442
  metadata={
443
+ **(
444
+ {"session_context": command.payload["session_context"]}
445
+ if "session_context" in command.payload
446
+ else {}
447
+ ),
410
448
  "command_id": str(command.command_id),
411
449
  "run_id": run_id,
412
450
  **continuation_metadata,
@@ -746,7 +784,17 @@ class AgentKernelWorker:
746
784
  )
747
785
  else:
748
786
  request_schema = dict(event.request.schema_)
749
- native_target = {"call_id": event.interaction_id}
787
+ # Codex maps the native JSON-RPC request id to a stable canonical
788
+ # interaction id for replay. The live client, however, indexes its
789
+ # pending callback by the original request id. Preserve that id as
790
+ # the provider target or SubmitInteraction can find the durable
791
+ # record but cannot wake the blocked Codex callback.
792
+ native_call_id = (
793
+ event.source.native_event_id
794
+ or event.source.native_item_id
795
+ or event.interaction_id
796
+ )
797
+ native_target = {"call_id": native_call_id}
750
798
  for key in ("checkpoint_id", "thread_id"):
751
799
  value = execution.handle.native_ref.get(key)
752
800
  if value is not None:
@@ -812,7 +860,13 @@ class AgentKernelWorker:
812
860
  kind=RESUME_TARGET_KINDS[target_dict["kind"]],
813
861
  id=str(target_dict["id"]),
814
862
  )
815
- resumed = await adapter.resume(handle, target, AdapterResumePayload(kind="free_text"))
863
+ resumed = await adapter.resume(
864
+ handle,
865
+ target,
866
+ AdapterResumePayload(
867
+ kind="free_text", session_context=command.payload.get("session_context")
868
+ ),
869
+ )
816
870
  execution = self._replace_handle(execution, resumed)
817
871
  self._start_stream(
818
872
  execution,
@@ -910,6 +964,7 @@ class AgentKernelWorker:
910
964
  context = InteractionResolveContext(
911
965
  adapter=execution.adapter,
912
966
  handle=execution.handle,
967
+ session_context=command.payload.get("session_context"),
913
968
  activation_id=activation.activation_id,
914
969
  fencing_token=fence,
915
970
  )