agentengine-sdk-python 0.8.2__py3-none-any.whl → 0.8.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (563) hide show
  1. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/METADATA +22 -28
  2. agentengine_sdk_python-0.8.4.dist-info/RECORD +1070 -0
  3. ksadk/_build_provenance.json +1 -0
  4. ksadk/agui/_agent_helpers.py +4 -0
  5. ksadk/api/client.py +108 -91
  6. ksadk/builders/code_builder.py +36 -9
  7. ksadk/builders/framework_requirements.py +2 -1
  8. ksadk/builders/ks3_uploader.py +36 -7
  9. ksadk/builders/managed_runtime_builder.py +4 -0
  10. ksadk/cli/__init__.py +38 -3
  11. ksadk/cli/cmd_managed_runtime.py +13 -1
  12. ksadk/cli/cmd_plugin.py +662 -0
  13. ksadk/cli/cmd_web.py +2 -5
  14. ksadk/cli/runtime_bootstrap.py +23 -1
  15. ksadk/codex/client.py +424 -96
  16. ksadk/codex/projection.py +24 -0
  17. ksadk/codex/runtime.py +83 -283
  18. ksadk/common/auth.py +16 -10
  19. ksadk/configs/env_registry.py +59 -3
  20. ksadk/configs/settings.py +9 -0
  21. ksadk/context_engine/contributors.py +73 -8
  22. ksadk/conversations/__init__.py +19 -0
  23. ksadk/conversations/context.py +104 -24
  24. ksadk/conversations/contracts.py +266 -0
  25. ksadk/conversations/message_projection.py +154 -15
  26. ksadk/conversations/projector.py +614 -0
  27. ksadk/conversations/reducer.py +98 -0
  28. ksadk/conversations/runtime_invocation.py +5 -0
  29. ksadk/conversations/runtime_payloads.py +1 -0
  30. ksadk/conversations/runtime_preparation.py +30 -27
  31. ksadk/conversations/runtime_resume.py +50 -2
  32. ksadk/conversations/runtime_stream_events.py +5 -0
  33. ksadk/conversations/runtime_streaming.py +25 -7
  34. ksadk/deployment/env_forward.py +2 -2
  35. ksadk/deployment/providers/serverless.py +1 -1
  36. ksadk/events/_v1_compat/projection.py +2 -0
  37. ksadk/events/adapters/_codex_validators.py +18 -7
  38. ksadk/events/adapters/codex.py +190 -0
  39. ksadk/events/adapters/langgraph.py +15 -1
  40. ksadk/events/canonical_store.py +3 -1
  41. ksadk/events/projections.py +1 -1
  42. ksadk/harness/__init__.py +45 -35
  43. ksadk/harness/config.py +2 -2
  44. ksadk/harness/runtime.py +75 -16
  45. ksadk/harness/tools.py +38 -13
  46. ksadk/interaction/provider.py +1 -0
  47. ksadk/interaction/providers/langgraph.py +1 -0
  48. ksadk/kernel/bootstrap.py +28 -4
  49. ksadk/kernel/contract_fingerprints.py +5 -4
  50. ksadk/kernel/contracts.py +8 -0
  51. ksadk/kernel/control.py +1 -0
  52. ksadk/kernel/ingress.py +36 -2
  53. ksadk/kernel/memory_store.py +1 -0
  54. ksadk/kernel/postgres_store.py +1 -0
  55. ksadk/kernel/sqlite_store.py +28 -0
  56. ksadk/kernel/store.py +3 -0
  57. ksadk/kernel/worker.py +76 -10
  58. ksadk/knowledge_base/client.py +57 -27
  59. ksadk/mcp_runtime/__init__.py +12 -4
  60. ksadk/memory/adk/backends/sdk_ltm_backend.py +161 -41
  61. ksadk/memory/adk/resilient_session_service.py +25 -17
  62. ksadk/memory/adk/short_term_memory.py +26 -9
  63. ksadk/memory/models.py +7 -4
  64. ksadk/memory/provider_resolver.py +3 -0
  65. ksadk/memory/providers/local_sqlite.py +7 -0
  66. ksadk/model_proxy/server.py +10 -5
  67. ksadk/plugins/__init__.py +171 -0
  68. ksadk/plugins/artifacts.py +275 -0
  69. ksadk/plugins/bridges/__init__.py +47 -0
  70. ksadk/plugins/bridges/codex.py +659 -0
  71. ksadk/plugins/bridges/dsh.py +1300 -0
  72. ksadk/plugins/builtins.py +746 -0
  73. ksadk/plugins/bundle.py +246 -0
  74. ksadk/plugins/bundle_security.py +191 -0
  75. ksadk/plugins/codex_manifest.py +983 -0
  76. ksadk/plugins/composition.py +537 -0
  77. ksadk/plugins/context_contributor.py +437 -0
  78. ksadk/plugins/contracts.py +569 -0
  79. ksadk/plugins/delivery.py +153 -0
  80. ksadk/plugins/dsh_installation_digest.py +71 -0
  81. ksadk/plugins/dsh_toolchain.py +1024 -0
  82. ksadk/plugins/ecosystem_bridge.py +1105 -0
  83. ksadk/plugins/ecosystem_probe.py +191 -0
  84. ksadk/plugins/host.py +787 -0
  85. ksadk/plugins/kernel_adapter.py +205 -0
  86. ksadk/plugins/providers/__init__.py +108 -0
  87. ksadk/plugins/providers/bundles/dsh-knowledge/cordis.patch.yml +3 -0
  88. ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +53 -0
  89. ksadk/plugins/providers/bundles/dsh-knowledge/package.json +16 -0
  90. ksadk/plugins/providers/bundles/dsh-memory/cordis.patch.yml +3 -0
  91. ksadk/plugins/providers/bundles/dsh-memory/index.mjs +175 -0
  92. ksadk/plugins/providers/bundles/dsh-memory/package.json +16 -0
  93. ksadk/plugins/providers/bundles/dsh-platform-resources/client.mjs +166 -0
  94. ksadk/plugins/providers/bundles/dsh-platform-resources/cordis.patch.yml +3 -0
  95. ksadk/plugins/providers/bundles/dsh-platform-resources/index.mjs +9 -0
  96. ksadk/plugins/providers/bundles/dsh-platform-resources/package.json +12 -0
  97. ksadk/plugins/providers/bundles/dsh-skill-center/cordis.patch.yml +3 -0
  98. ksadk/plugins/providers/bundles/dsh-skill-center/index.mjs +125 -0
  99. ksadk/plugins/providers/bundles/dsh-skill-center/package.json +16 -0
  100. ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
  101. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
  102. ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
  103. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/cordis.patch.yml +3 -0
  104. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +870 -0
  105. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
  106. ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +92 -0
  107. ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +15 -0
  108. ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
  109. ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
  110. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
  111. ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
  112. ksadk/plugins/providers/codex.py +988 -0
  113. ksadk/plugins/providers/codex_dsh.py +83 -0
  114. ksadk/plugins/providers/codex_native.py +368 -0
  115. ksadk/plugins/providers/codex_turn.py +301 -0
  116. ksadk/plugins/providers/dsh.py +951 -0
  117. ksadk/plugins/providers/dsh_capabilities.py +1389 -0
  118. ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
  119. ksadk/plugins/providers/dsh_mcp.py +467 -0
  120. ksadk/plugins/providers/harness.py +632 -0
  121. ksadk/plugins/providers/harness_dsh.py +91 -0
  122. ksadk/plugins/providers/legacy.py +215 -0
  123. ksadk/plugins/providers/legacy_catalog.py +100 -0
  124. ksadk/plugins/providers/mcp_projection.py +150 -0
  125. ksadk/plugins/providers/platform_resources.py +657 -0
  126. ksadk/plugins/providers/shipped_dsh.py +370 -0
  127. ksadk/plugins/resolver.py +338 -0
  128. ksadk/plugins/subagent_providers/__init__.py +12 -0
  129. ksadk/plugins/subagent_providers/codex.py +443 -0
  130. ksadk/plugins/subagents.py +333 -0
  131. ksadk/resource_runtime/__init__.py +4 -0
  132. ksadk/resource_runtime/broker.py +616 -0
  133. ksadk/resource_runtime/build_artifacts.py +165 -0
  134. ksadk/resource_runtime/contracts.py +138 -0
  135. ksadk/resource_runtime/discovery_receipts.py +100 -0
  136. ksadk/resource_runtime/discovery_skills.py +172 -0
  137. ksadk/resource_runtime/errors.py +6 -0
  138. ksadk/resource_runtime/ipc.py +142 -0
  139. ksadk/resource_runtime/kernel_approval.py +165 -0
  140. ksadk/resource_runtime/knowledge.py +114 -0
  141. ksadk/resource_runtime/langgraph.py +94 -0
  142. ksadk/resource_runtime/leases.py +191 -0
  143. ksadk/resource_runtime/managed_projection.py +186 -0
  144. ksadk/resource_runtime/mcp_server.py +138 -0
  145. ksadk/resource_runtime/memory_provider.py +318 -0
  146. ksadk/resource_runtime/memory_receipts.py +34 -0
  147. ksadk/resource_runtime/operation_ledger.py +211 -0
  148. ksadk/resource_runtime/plugin_config.py +48 -0
  149. ksadk/resource_runtime/policy_authorization.py +54 -0
  150. ksadk/resource_runtime/process.py +110 -0
  151. ksadk/resource_runtime/skill_artifacts.py +153 -0
  152. ksadk/resource_runtime/skill_runtime.py +42 -0
  153. ksadk/resource_runtime/skill_workspace.py +118 -0
  154. ksadk/resource_runtime/skills.py +215 -0
  155. ksadk/resource_runtime/snapshots.py +180 -0
  156. ksadk/resource_runtime/socket_server.py +103 -0
  157. ksadk/resource_runtime/supervisor.py +380 -0
  158. ksadk/resource_runtime/worker.py +504 -0
  159. ksadk/runners/_langgraph_runner_streams.py +74 -6
  160. ksadk/runners/adk_runner.py +149 -11
  161. ksadk/runners/base_runner.py +29 -1
  162. ksadk/runners/langgraph_runner.py +475 -145
  163. ksadk/runtime/_runner_adapter/stream_mapping.py +193 -60
  164. ksadk/runtime/adapter.py +3 -0
  165. ksadk/runtime/conversation_execution.py +92 -16
  166. ksadk/runtime/executor.py +78 -2
  167. ksadk/runtime/factory.py +30 -200
  168. ksadk/runtime/framework_adapters.py +41 -0
  169. ksadk/runtime/preprocessing.py +10 -2
  170. ksadk/runtime/runner_adapter.py +78 -14
  171. ksadk/runtime_context.py +40 -2
  172. ksadk/sandbox/__init__.py +2 -1
  173. ksadk/sandbox/backends/e2b.py +52 -11
  174. ksadk/sandbox/backends/local_process.py +9 -0
  175. ksadk/sandbox/base.py +2 -0
  176. ksadk/sandbox/e2b_connection.py +66 -0
  177. ksadk/sandbox/factory.py +72 -0
  178. ksadk/scheduler/__init__.py +18 -0
  179. ksadk/scheduler/calendar.py +102 -0
  180. ksadk/scheduler/contracts.py +254 -0
  181. ksadk/scheduler/dispatcher.py +129 -0
  182. ksadk/scheduler/engine.py +416 -0
  183. ksadk/scheduler/sqlite_store.py +581 -0
  184. ksadk/server/composition.py +2 -0
  185. ksadk/server/factory.py +5 -0
  186. ksadk/server/persistence_capability.py +516 -0
  187. ksadk/server/routes/control.py +210 -46
  188. ksadk/server/routes/dependencies.py +15 -0
  189. ksadk/server/routes/models.py +47 -4
  190. ksadk/server/routes/projection.py +252 -12
  191. ksadk/server/routes/sessions.py +284 -107
  192. ksadk/server/routes/streaming.py +43 -9
  193. ksadk/server/static/assets/{ArtifactsPanel-DSU1sWD_.js → ArtifactsPanel-CGbWlMNh.js} +1 -1
  194. ksadk/server/static/assets/{CodeBlock-DOH6MVcn.js → CodeBlock-b4C7upmO.js} +3 -3
  195. ksadk/server/static/assets/{MathMessageMarkdown-BL8my1R2.js → MathMessageMarkdown-DbdW5A4_.js} +4 -4
  196. ksadk/server/static/assets/{MermaidBlock-Dz4IP-Tx.js → MermaidBlock-BEBN4Ksz.js} +6 -6
  197. ksadk/server/static/assets/{NativeTerminalPanel-DUrK0JpZ.js → NativeTerminalPanel-zvL-WpAn.js} +1 -1
  198. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-g20pFzNV.js → abnfDiagram-VCTEODGH-BYafW7Za.js} +1 -1
  199. ksadk/server/static/assets/{arc-C4FzinUA.js → arc-bTohInsS.js} +1 -1
  200. ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +1 -0
  201. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-DpIqL5h4.js → architectureDiagram-5GKGNRK7-Ch5Lbzsi.js} +1 -1
  202. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-BjkljTNz.js → blockDiagram-NRAW4CY4-kqF4MDOG.js} +1 -1
  203. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-Dk_ieq2X.js → c4Diagram-UCG6FXSJ-8uSRIODv.js} +1 -1
  204. ksadk/server/static/assets/channel-CF5Up3hQ.js +1 -0
  205. ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +1 -0
  206. ksadk/server/static/assets/{chunk-5VM5RSS4-BVHAchFb.js → chunk-5VM5RSS4-DkhehZDr.js} +1 -1
  207. ksadk/server/static/assets/{chunk-F27PBJKO-C-ipQzuS.js → chunk-F27PBJKO-BdXhtPe9.js} +1 -1
  208. ksadk/server/static/assets/{chunk-G27WJ6UU-C2EyJbIK.js → chunk-G27WJ6UU-DPTpvpwi.js} +1 -1
  209. ksadk/server/static/assets/{chunk-JWPE2WC7-vYvVJb_M.js → chunk-JWPE2WC7-Pqoh38el.js} +1 -1
  210. ksadk/server/static/assets/{chunk-LCL6LL3I-BcI6ysPT.js → chunk-LCL6LL3I-DeU00qC-.js} +1 -1
  211. ksadk/server/static/assets/{chunk-POPQ4Y6H-C030x_Z1.js → chunk-POPQ4Y6H-CzxScFkr.js} +1 -1
  212. ksadk/server/static/assets/{chunk-RHFEMEQ7-yyGpsz4n.js → chunk-RHFEMEQ7-DpqMx-ux.js} +1 -1
  213. ksadk/server/static/assets/{chunk-SVP7TREG-BLTlmMU7.js → chunk-SVP7TREG-C6t0SypQ.js} +1 -1
  214. ksadk/server/static/assets/{chunk-XXDRQBXY-C_32ArgP.js → chunk-XXDRQBXY-DVaeafZk.js} +1 -1
  215. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +1 -0
  216. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +1 -0
  217. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-9YQYwdl0.js → cose-bilkent-JH36ORCC-Bf9D3tzJ.js} +1 -1
  218. ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +1 -0
  219. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-ErLF5N13.js → cynefinDiagram-5FMLGOSQ-B9cY3iTz.js} +1 -1
  220. ksadk/server/static/assets/{dagre-3AP2YEHR-DFiQF-6f.js → dagre-3AP2YEHR-CSwlx3CB.js} +1 -1
  221. ksadk/server/static/assets/{dagre-BuhGnRI1.js → dagre-UBpgon5q.js} +1 -1
  222. ksadk/server/static/assets/{diagram-S7CK7UJ4-Bt1v8-GC.js → diagram-S7CK7UJ4-C9akhN9a.js} +1 -1
  223. ksadk/server/static/assets/{diagram-UQ7AKVKN-DSCxJdBK.js → diagram-UQ7AKVKN-CgedhTPI.js} +1 -1
  224. ksadk/server/static/assets/{diagram-VSXAHHWV-DHfYwp_9.js → diagram-VSXAHHWV-Cjucz5BY.js} +1 -1
  225. ksadk/server/static/assets/{diagram-VX7I27RA-DdzD-4Le.js → diagram-VX7I27RA-Dd4Vleyn.js} +1 -1
  226. ksadk/server/static/assets/{diagram-Z3DM3KII-Du-nAJ9F.js → diagram-Z3DM3KII-CZ2jGtYW.js} +1 -1
  227. ksadk/server/static/assets/{dist-B7seoj3d.js → dist-B2_CVgKv.js} +1 -1
  228. ksadk/server/static/assets/{dist-CSh_DE14.js → dist-B3FR1SKK.js} +1 -1
  229. ksadk/server/static/assets/{dist-DUX-id_F.js → dist-BIr4DSRq.js} +1 -1
  230. ksadk/server/static/assets/{dist-C_wsv-Qd.js → dist-BgV_owcB.js} +1 -1
  231. ksadk/server/static/assets/{dist-W-TIVntx.js → dist-Bj730Ib4.js} +1 -1
  232. ksadk/server/static/assets/{dist-BytlxIDT.js → dist-BnaTiyzN.js} +1 -1
  233. ksadk/server/static/assets/{dist-CXYYBw3_.js → dist-C1NMAY5a.js} +1 -1
  234. ksadk/server/static/assets/{dist-dDdADKFA.js → dist-C5_ZAZsG.js} +1 -1
  235. ksadk/server/static/assets/{dist-BVDffZ0U.js → dist-CB9iJrvg.js} +1 -1
  236. ksadk/server/static/assets/{dist-Bf2M8m3N.js → dist-CFzsn6BG.js} +1 -1
  237. ksadk/server/static/assets/{dist-ngtN0DJB.js → dist-Cf125P_m.js} +1 -1
  238. ksadk/server/static/assets/{dist-BE7bu-DL.js → dist-ClYUxfeK.js} +1 -1
  239. ksadk/server/static/assets/{dist-DNp6rLRA.js → dist-DFD6Qa6T.js} +1 -1
  240. ksadk/server/static/assets/{dist-BX8z72IC.js → dist-DVCOWtha.js} +1 -1
  241. ksadk/server/static/assets/{dist-dydu68Fl.js → dist-D_ctSS2i.js} +1 -1
  242. ksadk/server/static/assets/{dist-ClxGviKw.js → dist-DiixqL0J.js} +1 -1
  243. ksadk/server/static/assets/{dist-BjU6y-A2.js → dist-DoVSwoDb.js} +1 -1
  244. ksadk/server/static/assets/{dist-Dq9gLD7L.js → dist-DvFK7p5S.js} +1 -1
  245. ksadk/server/static/assets/{dist-8hqcx0sU.js → dist-QfkEHOlb.js} +1 -1
  246. ksadk/server/static/assets/{dist-CttYUqzS.js → dist-btbmmX5O.js} +1 -1
  247. ksadk/server/static/assets/{dist-DmldrHd_.js → dist-fBO2v5Kt.js} +1 -1
  248. ksadk/server/static/assets/{dist-DnfXs8Vn.js → dist-ufY3F5p6.js} +1 -1
  249. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Da9C9NO1.js → ebnfDiagram-PWID7BFC-Ci8NqqZu.js} +1 -1
  250. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-EAGqqR79.js → erDiagram-SSCWMZ5O-CCIOhLZG.js} +1 -1
  251. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +1 -0
  252. ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +1 -0
  253. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DqJsKb59.js → ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js} +1 -1
  254. ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +1 -0
  255. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-B6g4dtDi.js → gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js} +1 -1
  256. ksadk/server/static/assets/index-DcTML1Up.css +2 -0
  257. ksadk/server/static/assets/index-Dh2XHqPK.js +244 -0
  258. ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +1 -0
  259. ksadk/server/static/assets/{infoDiagram-RXCK75RN-Djm_nbd5.js → infoDiagram-RXCK75RN-CO0rRTRA.js} +1 -1
  260. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-DWya9SG2.js → ishikawaDiagram-5VMMS53U-CHiaedSS.js} +1 -1
  261. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DutxhSNI.js → journeyDiagram-EYS64GPL-CHcCIB09.js} +1 -1
  262. ksadk/server/static/assets/{kanban-definition-3QL26DDD-DJdOF8Fm.js → kanban-definition-3QL26DDD-CJ_ebBZf.js} +1 -1
  263. ksadk/server/static/assets/{katex-vFWytM5c.js → katex-B4weu383.js} +1 -1
  264. ksadk/server/static/assets/{linear-BHjG8b-J.js → linear-V-MgYHW1.js} +1 -1
  265. ksadk/server/static/assets/{mermaid-parser.core-KGSy4jWT.js → mermaid-parser.core-CBijEX_c.js} +2 -2
  266. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-9-HC88D4.js → mindmap-definition-FBJOCRG2-Bc-pQvpp.js} +1 -1
  267. ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +1 -0
  268. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-DrEZd4fD.js → pegDiagram-XKGWAZYB-D7genGLl.js} +1 -1
  269. ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +1 -0
  270. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-DpjqOFFp.js → pieDiagram-E7YTZNPT-Bxj32zwD.js} +1 -1
  271. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BiNhgOXX.js → quadrantDiagram-AXDQQJYC-BURv2mGh.js} +1 -1
  272. ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +1 -0
  273. ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +1 -0
  274. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +1 -0
  275. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +1 -0
  276. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +1 -0
  277. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-_Y3Ojg6G.js → railroadDiagram-O6MQD6OU-CCsh3avW.js} +1 -1
  278. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-DeCFdg9K.js → requirementDiagram-EFPCY7ZU-_FRRBKEd.js} +1 -1
  279. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-CPH75rhw.js → sankeyDiagram-P5KCCOFB-C-gr2o9M.js} +1 -1
  280. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-OEpQQdr4.js → sequenceDiagram-WJ2MYXX4-D97NmfKg.js} +1 -1
  281. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-heUErzhI.js → sizeCapture-X5ZJPWSS-DjrPC5FX.js} +1 -1
  282. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DvA3jSMB.js → stateDiagram-HBIQ2CUA-DzMNg1hh.js} +1 -1
  283. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +1 -0
  284. ksadk/server/static/assets/{swimlanes-XN3QIQJK-CR-dfN_t.js → swimlanes-XN3QIQJK-Cssf_CsU.js} +1 -1
  285. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +8 -0
  286. ksadk/server/static/assets/{timeline-definition-24CTP7MA-DAVJf1TX.js → timeline-definition-24CTP7MA-BWTHzyS1.js} +1 -1
  287. ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +1 -0
  288. ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +1 -0
  289. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-DwM8eDkh.js → vennDiagram-4TSXK5OY-BSKgJsmR.js} +1 -1
  290. ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +1 -0
  291. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DZL-Zz2t.js → wardleyDiagram-VM6X3IG4-eflHNoaZ.js} +1 -1
  292. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js → xychartDiagram-S5SC5T6Z-eYqrQ-v4.js} +1 -1
  293. ksadk/server/static/index.html +2 -2
  294. ksadk/session_context.py +66 -0
  295. ksadk/sessions/__init__.py +11 -21
  296. ksadk/sessions/_local_service_sync.py +263 -1
  297. ksadk/sessions/base.py +176 -0
  298. ksadk/sessions/errors.py +4 -0
  299. ksadk/sessions/in_memory.py +309 -19
  300. ksadk/sessions/local_service.py +83 -1
  301. ksadk/sessions/persistence.py +275 -0
  302. ksadk/sessions/postgres_service.py +358 -0
  303. ksadk/sessions/resilience.py +8 -0
  304. ksadk/sessions/resilient.py +362 -4
  305. ksadk/sessions/topology.py +135 -0
  306. ksadk/skills/models.py +26 -4
  307. ksadk/skills/package_store.py +186 -38
  308. ksadk/skills/runtime/agent.py +31 -6
  309. ksadk/skills/runtime/artifact_delivery.py +139 -0
  310. ksadk/skills/runtime/backends/e2b.py +98 -6
  311. ksadk/skills/runtime/backends/local.py +73 -8
  312. ksadk/skills/runtime/base.py +3 -0
  313. ksadk/skills/runtime/executor.py +2 -0
  314. ksadk/skills/runtime/loader.py +10 -2
  315. ksadk/skills/runtime/pinned.py +114 -0
  316. ksadk/skills/runtime/request.py +31 -0
  317. ksadk/skills/service_client.py +211 -24
  318. ksadk/studio/agent_lifecycle.py +26 -20
  319. ksadk/studio/api.py +714 -90
  320. ksadk/studio/api_catalog_routes.py +23 -0
  321. ksadk/studio/api_contracts.py +34 -1
  322. ksadk/studio/api_plugin_routes.py +911 -0
  323. ksadk/studio/api_resource_connections.py +183 -0
  324. ksadk/studio/attachment_store.py +187 -0
  325. ksadk/studio/authoring.py +10 -4
  326. ksadk/studio/authoring_coordinator.py +31 -16
  327. ksadk/studio/builder.py +199 -43
  328. ksadk/studio/cloud.py +346 -104
  329. ksadk/studio/cloud_shared_web.py +565 -0
  330. ksadk/studio/codex_agent_service.py +140 -27
  331. ksadk/studio/codex_builder.py +294 -16
  332. ksadk/studio/codex_credentials.py +90 -0
  333. ksadk/studio/codex_manifest.py +51 -4
  334. ksadk/studio/codex_plugin_store.py +746 -0
  335. ksadk/studio/codex_provider_build.py +231 -0
  336. ksadk/studio/codex_run.py +200 -29
  337. ksadk/studio/compatibility_report.py +456 -0
  338. ksadk/studio/compiler.py +84 -15
  339. ksadk/studio/contracts.py +249 -4
  340. ksadk/studio/dsh_application.py +137 -0
  341. ksadk/studio/dsh_capability_service.py +1107 -0
  342. ksadk/studio/dsh_models.py +59 -0
  343. ksadk/studio/dsh_provider_registration.py +1075 -0
  344. ksadk/studio/event_store.py +54 -6
  345. ksadk/studio/framework_run.py +37 -4
  346. ksadk/studio/hosted_kernel.py +89 -14
  347. ksadk/studio/mcp_runtime.py +11 -3
  348. ksadk/studio/model_client.py +2 -2
  349. ksadk/studio/operations.py +12 -2
  350. ksadk/studio/plugin_composition.py +468 -0
  351. ksadk/studio/plugin_kernel_adapter.py +28 -0
  352. ksadk/studio/plugin_runtime.py +831 -0
  353. ksadk/studio/resource_authority.py +637 -0
  354. ksadk/studio/resource_binding_validation.py +77 -0
  355. ksadk/studio/resource_build_admission.py +196 -0
  356. ksadk/studio/resource_build_materializer.py +149 -0
  357. ksadk/studio/resource_catalog.py +149 -3
  358. ksadk/studio/resource_connections.py +220 -0
  359. ksadk/studio/run_service.py +1144 -96
  360. ksadk/studio/runtime_source.py +24 -8
  361. ksadk/studio/scheduler_assistant.py +317 -0
  362. ksadk/studio/scheduler_runtime.py +383 -0
  363. ksadk/studio/scheduler_service.py +214 -0
  364. ksadk/studio/service.py +1131 -95
  365. ksadk/studio/shared_web.py +610 -87
  366. ksadk/studio/soul.py +52 -0
  367. ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +41 -0
  368. ksadk/studio/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  369. ksadk/studio/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  370. ksadk/studio/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  371. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  372. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  373. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  374. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  375. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  376. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  377. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  378. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  379. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  380. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  381. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  382. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  383. ksadk/studio/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  384. ksadk/studio/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  385. ksadk/studio/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  386. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  387. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  388. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  389. ksadk/studio/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  390. ksadk/studio/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  391. ksadk/studio/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  392. ksadk/studio/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  393. ksadk/studio/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  394. ksadk/studio/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  395. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  396. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  397. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  398. ksadk/studio/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  399. ksadk/studio/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  400. ksadk/studio/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  401. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  402. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  403. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  404. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  405. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  406. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  407. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  408. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  409. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  410. ksadk/studio/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  411. ksadk/studio/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  412. ksadk/studio/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  413. ksadk/studio/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  414. ksadk/studio/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  415. ksadk/studio/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  416. ksadk/studio/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  417. ksadk/studio/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  418. ksadk/studio/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  419. ksadk/studio/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  420. ksadk/studio/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  421. ksadk/studio/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  422. ksadk/studio/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  423. ksadk/studio/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  424. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  425. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  426. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  427. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--BEOyPC3w.css +1 -0
  428. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +8 -0
  429. ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +44 -0
  430. ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +3 -0
  431. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +1 -0
  432. ksadk/studio/static/assets/arc-Pry-7G1_.js +1 -0
  433. ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +1 -0
  434. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +36 -0
  435. ksadk/studio/static/assets/array-BifhSqXX.js +1 -0
  436. ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CFmPl1de.js +129 -0
  437. ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BRrGu8qt.js +38 -0
  438. ksadk/studio/static/assets/channel-BqO-gtEw.js +1 -0
  439. ksadk/studio/static/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  440. ksadk/studio/static/assets/chunk-4HAMMTFA-D220vUtq.js +62 -0
  441. ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  442. ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +2 -0
  443. ksadk/studio/static/assets/chunk-DU6HZSFF-C4DtVpCu.js +128 -0
  444. ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +1 -0
  445. ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
  446. ksadk/studio/static/assets/chunk-GMAD6QVW-DiQA-u2N.js +72 -0
  447. ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +1 -0
  448. ksadk/studio/static/assets/chunk-IMKFNOWR-BSlbjT_b.js +231 -0
  449. ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  450. ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +1 -0
  451. ksadk/studio/static/assets/chunk-OSK3NFVY-M2m6G3j4.js +10 -0
  452. ksadk/studio/static/assets/chunk-P2QGCYS3-DezaQxiK.js +1 -0
  453. ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +1 -0
  454. ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +1 -0
  455. ksadk/studio/static/assets/chunk-SHT3W25Y-DAyIVp5H.js +168 -0
  456. ksadk/studio/static/assets/chunk-SVP7TREG-DulomOrS.js +88 -0
  457. ksadk/studio/static/assets/chunk-TICWLB2K-bHJYoflj.js +206 -0
  458. ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +1 -0
  459. ksadk/studio/static/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  460. ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +1 -0
  461. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +1 -0
  462. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +1 -0
  463. ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +1 -0
  464. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +62 -0
  465. ksadk/studio/static/assets/cytoscape.esm-CGd-uY3x.js +321 -0
  466. ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +4 -0
  467. ksadk/studio/static/assets/dagre-PrKaheQc.js +1 -0
  468. ksadk/studio/static/assets/defaultLocale-BFoDCU3G.js +1 -0
  469. ksadk/studio/static/assets/diagram-S7CK7UJ4-0BZ98mya.js +30 -0
  470. ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +41 -0
  471. ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +3 -0
  472. ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +24 -0
  473. ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +24 -0
  474. ksadk/studio/static/assets/dist-v5Q1xZ2K.js +1 -0
  475. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +1 -0
  476. ksadk/studio/static/assets/erDiagram-RLTQ6QDP-DLGry2Ap.js +99 -0
  477. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +1 -0
  478. ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +1 -0
  479. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +292 -0
  480. ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +1 -0
  481. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +106 -0
  482. ksadk/studio/static/assets/graphlib-DS17s2tU.js +1 -0
  483. ksadk/studio/static/assets/index-CeHL9ARV.css +2 -0
  484. ksadk/studio/static/assets/index-D9QEcVpL.js +320 -0
  485. ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +1 -0
  486. ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +2 -0
  487. ksadk/studio/static/assets/init-C-OQMol4.js +1 -0
  488. ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-CljI2wyf.js +70 -0
  489. ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-D50Fo2sL.js +139 -0
  490. ksadk/studio/static/assets/kanban-definition-UXKFOSKX-DimfOTam.js +89 -0
  491. ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
  492. ksadk/studio/static/assets/line-CX5BOOUP.js +1 -0
  493. ksadk/studio/static/assets/linear-BCxN9JLv.js +1 -0
  494. ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +7 -0
  495. ksadk/studio/static/assets/mindmap-definition-YA3MSWOX-Bizzqy5R.js +96 -0
  496. ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
  497. ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +1 -0
  498. ksadk/studio/static/assets/path-fybaL0A-.js +1 -0
  499. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +1 -0
  500. ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +1 -0
  501. ksadk/studio/static/assets/pieDiagram-E7YTZNPT-B9mrFSDF.js +39 -0
  502. ksadk/studio/static/assets/quadrantDiagram-AXDQQJYC-NzUfCbMR.js +7 -0
  503. ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +1 -0
  504. ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +1 -0
  505. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +1 -0
  506. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +1 -0
  507. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +1 -0
  508. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +1 -0
  509. ksadk/studio/static/assets/requirementDiagram-BXWQKSXE-BF3d103U.js +84 -0
  510. ksadk/studio/static/assets/rolldown-runtime-Dy4uBu1J-DK3Fl9T5.js +1 -0
  511. ksadk/studio/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
  512. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +40 -0
  513. ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js +162 -0
  514. ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  515. ksadk/studio/static/assets/src-SFn9St9H.js +1 -0
  516. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +1 -0
  517. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +1 -0
  518. ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +1 -0
  519. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +8 -0
  520. ksadk/studio/static/assets/timeline-definition-24CTP7MA-DxmSSjRB.js +120 -0
  521. ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +1 -0
  522. ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +1 -0
  523. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +34 -0
  524. ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +1 -0
  525. ksadk/studio/static/assets/wardleyDiagram-VM6X3IG4-Ba1AOWoe.js +78 -0
  526. ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js +7 -0
  527. ksadk/studio/static/index.html +2 -2
  528. ksadk/studio/validator.py +1 -1
  529. ksadk/studio/workspace.py +1 -0
  530. ksadk/version.py +1 -1
  531. ksadk_runtime_common/workspace_files/path_utils.py +41 -0
  532. agentengine_sdk_python-0.8.2.dist-info/RECORD +0 -778
  533. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +0 -1
  534. ksadk/server/static/assets/channel-4cQHKtx1.js +0 -1
  535. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +0 -1
  536. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +0 -1
  537. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +0 -1
  538. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +0 -1
  539. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +0 -1
  540. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +0 -1
  541. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +0 -1
  542. ksadk/server/static/assets/index-8ipRcQ-M.js +0 -240
  543. ksadk/server/static/assets/index-ByFCqjlh.css +0 -2
  544. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +0 -1
  545. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +0 -1
  546. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +0 -1
  547. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +0 -1
  548. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +0 -1
  549. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +0 -1
  550. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +0 -1
  551. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +0 -1
  552. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +0 -1
  553. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +0 -8
  554. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +0 -1
  555. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +0 -1
  556. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +0 -1
  557. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
  558. ksadk/studio/static/assets/index-BLpcdrgW.css +0 -1
  559. ksadk/studio/static/assets/index-CYekR2Xv.js +0 -260
  560. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/WHEEL +0 -0
  561. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/entry_points.txt +0 -0
  562. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/licenses/LICENSE +0 -0
  563. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/top_level.txt +0 -0
@@ -48,6 +48,7 @@ from ksadk.events.canonical import (
48
48
  ContinuationCreated,
49
49
  ContinuationResumed,
50
50
  ErrorInfo,
51
+ InteractionRequested,
51
52
  ItemCompleted,
52
53
  ItemFailed,
53
54
  ItemStarted,
@@ -56,10 +57,12 @@ from ksadk.events.canonical import (
56
57
  RunCanceled,
57
58
  RunCompleted,
58
59
  RunFailed,
60
+ RunInterrupted,
59
61
  RunProgress,
60
62
  RunStarted,
61
63
  RuntimeEvent,
62
64
  SourceRef,
65
+ StructuredInputRequest,
63
66
  UsageReported,
64
67
  )
65
68
  from ksadk.events.content import (
@@ -191,6 +194,20 @@ class CodexEventAdapter(_CodexInteractionMixin):
191
194
  return self._map_server_request_resolved(
192
195
  params=params, context=context, cursor=cursor, timestamp=timestamp
193
196
  )
197
+ if method == "a2ui/surface":
198
+ return self._map_a2ui_surface(
199
+ params=params,
200
+ context=context,
201
+ cursor=cursor,
202
+ timestamp=timestamp,
203
+ )
204
+ if method == "a2ui/interaction":
205
+ return self._map_a2ui_interaction(
206
+ params=params,
207
+ context=context,
208
+ cursor=cursor,
209
+ timestamp=timestamp,
210
+ )
194
211
  if method in _CONTROL_INTERACTION_METHODS:
195
212
  return self._map_control_interaction_request(
196
213
  message=message,
@@ -255,6 +272,179 @@ class CodexEventAdapter(_CodexInteractionMixin):
255
272
  )
256
273
  _fail("unsupported_method", "method", f"Unsupported Codex app-server method: {method}")
257
274
 
275
+ @staticmethod
276
+ def _a2ui_scope(
277
+ params: Mapping[str, Any],
278
+ context: CodexAdapterContext,
279
+ *,
280
+ surface_id: str,
281
+ ) -> tuple[str, str, str]:
282
+ thread_value = params.get("threadId", params.get("thread_id"))
283
+ turn_value = params.get("turnId", params.get("turn_id"))
284
+ thread_id = (
285
+ _required_string(thread_value, "params.threadId")
286
+ if thread_value is not None
287
+ else f"runtime:{context.run_id}"
288
+ )
289
+ turn_id = (
290
+ _required_string(turn_value, "params.turnId")
291
+ if turn_value is not None
292
+ else "a2ui"
293
+ )
294
+ return thread_id, turn_id, stable_scope_id("codex", thread_id, turn_id, surface_id)
295
+
296
+ @staticmethod
297
+ def _a2ui_source(
298
+ *,
299
+ method: str,
300
+ cursor: str,
301
+ thread_id: str,
302
+ turn_id: str,
303
+ native_item_id: str,
304
+ surface_id: str,
305
+ metadata: Mapping[str, Any] | None = None,
306
+ ) -> SourceRef:
307
+ source = _protocol_source(
308
+ method=method,
309
+ cursor=cursor,
310
+ thread_id=thread_id,
311
+ turn_id=turn_id,
312
+ native_item_id=native_item_id,
313
+ native_event_id=native_item_id,
314
+ )
315
+ return source.model_copy(
316
+ update={
317
+ "protocol": "a2ui",
318
+ "metadata": {
319
+ **source.metadata,
320
+ "surface_id": surface_id,
321
+ **dict(metadata or {}),
322
+ },
323
+ }
324
+ )
325
+
326
+ def _map_a2ui_surface(
327
+ self,
328
+ *,
329
+ params: Mapping[str, Any],
330
+ context: CodexAdapterContext,
331
+ cursor: str,
332
+ timestamp: float,
333
+ ) -> tuple[RuntimeEvent, ...]:
334
+ """Map one complete A2UI surface description as an immutable operation batch."""
335
+
336
+ surface_id = _required_string(params.get("surface_id"), "params.surface_id")
337
+ surface = _mapping(params.get("surface"), "params.surface")
338
+ thread_id, turn_id, scope_id = self._a2ui_scope(
339
+ params, context, surface_id=surface_id
340
+ )
341
+ item_id = stable_item_id("codex", scope_id, "a2ui-surface", surface_id)
342
+ source = self._a2ui_source(
343
+ method="a2ui/surface",
344
+ cursor=cursor,
345
+ thread_id=thread_id,
346
+ turn_id=turn_id,
347
+ native_item_id=surface_id,
348
+ surface_id=surface_id,
349
+ metadata={
350
+ "operation_batch": True,
351
+ "surface_lifecycle": "begin",
352
+ "catalog_id": str(surface.get("catalog_id") or surface.get("catalogId") or ""),
353
+ },
354
+ )
355
+ snapshot = ContentSnapshot(
356
+ parts=(
357
+ DataContent(
358
+ part_id="a2ui-surface",
359
+ data={"surface_id": surface_id, **_json_value(surface)},
360
+ ),
361
+ )
362
+ )
363
+ env = _envelope(context, cursor, timestamp)
364
+ return (
365
+ ItemStarted(
366
+ **env(scope_id, item_id, "item.started", "a2ui-surface", source),
367
+ item_id=item_id,
368
+ item_kind="data",
369
+ initial=snapshot,
370
+ ),
371
+ ItemCompleted(
372
+ **env(scope_id, item_id, "item.completed", "a2ui-surface", source),
373
+ item_id=item_id,
374
+ item_kind="data",
375
+ snapshot=snapshot,
376
+ ),
377
+ )
378
+
379
+ def _map_a2ui_interaction(
380
+ self,
381
+ *,
382
+ params: Mapping[str, Any],
383
+ context: CodexAdapterContext,
384
+ cursor: str,
385
+ timestamp: float,
386
+ ) -> tuple[RuntimeEvent, ...]:
387
+ """Map the client-owned A2UI input request without changing its live call id."""
388
+
389
+ surface_id = _required_string(params.get("surface_id"), "params.surface_id")
390
+ interaction_id = _required_string(
391
+ params.get("interaction_id"), "params.interaction_id"
392
+ )
393
+ kind = _required_string(params.get("kind"), "params.kind")
394
+ schema = _mapping(params.get("input_schema"), "params.input_schema")
395
+ is_blocking = params.get("is_blocking", True)
396
+ if not isinstance(is_blocking, bool):
397
+ _fail(
398
+ "invalid_interaction_request",
399
+ "params.is_blocking",
400
+ "A2UI is_blocking must be a boolean",
401
+ )
402
+ thread_id, turn_id, scope_id = self._a2ui_scope(
403
+ params, context, surface_id=surface_id
404
+ )
405
+ source = self._a2ui_source(
406
+ method="a2ui/interaction",
407
+ cursor=cursor,
408
+ thread_id=thread_id,
409
+ turn_id=turn_id,
410
+ native_item_id=interaction_id,
411
+ surface_id=surface_id,
412
+ metadata={"kind": kind, "is_blocking": is_blocking},
413
+ )
414
+ env = _envelope(context, cursor, timestamp)
415
+ requested = InteractionRequested(
416
+ **env(
417
+ scope_id,
418
+ interaction_id,
419
+ "interaction.requested",
420
+ "structured_input",
421
+ source,
422
+ ),
423
+ interaction_id=interaction_id,
424
+ interaction_kind="structured_input",
425
+ request=StructuredInputRequest(prompt=None, schema=_json_value(schema)),
426
+ )
427
+ if not is_blocking:
428
+ return (requested,)
429
+ return (
430
+ requested,
431
+ RunInterrupted(
432
+ **env(
433
+ scope_id,
434
+ turn_id,
435
+ "run.interrupted",
436
+ interaction_id,
437
+ source,
438
+ ),
439
+ status="interrupted",
440
+ reason="Codex requires user interaction",
441
+ interaction_id=interaction_id,
442
+ continuation_id=self._thread_continuations.setdefault(
443
+ thread_id, _thread_continuation_identity(thread_id)[1]
444
+ ),
445
+ ),
446
+ )
447
+
258
448
  def _map_token_usage(
259
449
  self,
260
450
  *,
@@ -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/__init__.py CHANGED
@@ -1,35 +1,45 @@
1
- """HarnessApp — 统一 Runtime 的可部署交付物 / composition root (goal-08)。"""
2
-
3
- from ksadk.harness.app import HarnessApp, HarnessCapabilities, HarnessPlugin
4
- from ksadk.harness.config import (
5
- HarnessConfig,
6
- HarnessConfigError,
7
- McpToolSpec,
8
- SandboxPolicy,
9
- )
10
- from ksadk.harness.reasoner import (
11
- HarnessReasoner,
12
- HarnessReasoningTurn,
13
- HarnessToolCall,
14
- LiteLLMHarnessReasoner,
15
- )
16
- from ksadk.harness.runtime import HarnessRuntime, HarnessRuntimeAdapter
17
- from ksadk.harness.sandbox import HarnessSandboxExecutor, SandboxPolicyDenied
18
-
19
- __all__ = [
20
- "HarnessApp",
21
- "HarnessCapabilities",
22
- "HarnessConfig",
23
- "HarnessConfigError",
24
- "HarnessPlugin",
25
- "HarnessReasoner",
26
- "HarnessRuntime",
27
- "HarnessRuntimeAdapter",
28
- "HarnessReasoningTurn",
29
- "HarnessSandboxExecutor",
30
- "HarnessToolCall",
31
- "LiteLLMHarnessReasoner",
32
- "McpToolSpec",
33
- "SandboxPolicy",
34
- "SandboxPolicyDenied",
35
- ]
1
+ """Public Harness surface without eagerly requiring an ADK runtime.
2
+
3
+ Studio must be usable for Codex and DSH Providers from a base ``ksadk``
4
+ installation. Harness keeps ADK as an optional execution dependency, so
5
+ importing its configuration types cannot import the full Harness runtime.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from importlib import import_module
11
+ from typing import Any
12
+
13
+ _EXPORTS = {
14
+ "HarnessApp": ("ksadk.harness.app", "HarnessApp"),
15
+ "HarnessCapabilities": ("ksadk.harness.app", "HarnessCapabilities"),
16
+ "HarnessPlugin": ("ksadk.harness.app", "HarnessPlugin"),
17
+ "HarnessConfig": ("ksadk.harness.config", "HarnessConfig"),
18
+ "HarnessConfigError": ("ksadk.harness.config", "HarnessConfigError"),
19
+ "McpToolSpec": ("ksadk.harness.config", "McpToolSpec"),
20
+ "SandboxPolicy": ("ksadk.harness.config", "SandboxPolicy"),
21
+ "HarnessReasoner": ("ksadk.harness.reasoner", "HarnessReasoner"),
22
+ "HarnessReasoningTurn": ("ksadk.harness.reasoner", "HarnessReasoningTurn"),
23
+ "HarnessToolCall": ("ksadk.harness.reasoner", "HarnessToolCall"),
24
+ "LiteLLMHarnessReasoner": ("ksadk.harness.reasoner", "LiteLLMHarnessReasoner"),
25
+ "HarnessRuntime": ("ksadk.harness.runtime", "HarnessRuntime"),
26
+ "HarnessRuntimeAdapter": ("ksadk.harness.runtime", "HarnessRuntimeAdapter"),
27
+ "HarnessSandboxExecutor": ("ksadk.harness.sandbox", "HarnessSandboxExecutor"),
28
+ "SandboxPolicyDenied": ("ksadk.harness.sandbox", "SandboxPolicyDenied"),
29
+ }
30
+
31
+ __all__ = list(_EXPORTS)
32
+
33
+
34
+ def __getattr__(name: str) -> Any:
35
+ try:
36
+ module_name, attribute = _EXPORTS[name]
37
+ except KeyError:
38
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}") from None
39
+ value = getattr(import_module(module_name), attribute)
40
+ globals()[name] = value
41
+ return value
42
+
43
+
44
+ def __dir__() -> list[str]:
45
+ return sorted({*globals(), *__all__})
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
@@ -72,6 +72,19 @@ class _HarnessRun:
72
72
  done: bool = False
73
73
 
74
74
 
75
+ @dataclass
76
+ class _HarnessSession:
77
+ """Process-local transcript and serialization boundary for one Session.
78
+
79
+ The public capability matrix deliberately advertises process-scoped,
80
+ non-durable continuity. Keeping this state on the adapter makes that
81
+ declaration true without pretending that a restart can recover it.
82
+ """
83
+
84
+ messages: list[dict[str, Any]]
85
+ lock: asyncio.Lock
86
+
87
+
75
88
  class HarnessRuntimeAdapter(RuntimeAdapter):
76
89
  """Execute a YAML Harness config directly as RuntimeEvent streams."""
77
90
 
@@ -95,6 +108,9 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
95
108
  self._tools: tuple[HarnessTool, ...] | None = None
96
109
  self._tool_lock = asyncio.Lock()
97
110
  self._mcp_toolsets: list[Any] = []
111
+ self._sessions: dict[tuple[str, str, str], _HarnessSession] = {}
112
+ self._lifecycle_lock = asyncio.Lock()
113
+ self._closed = False
98
114
 
99
115
  @property
100
116
  def harness_config(self) -> HarnessConfig:
@@ -109,10 +125,13 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
109
125
  return self._sandbox.workspace_root
110
126
 
111
127
  async def start(self, request: StartRequest) -> RunHandle:
112
- run_id = str(request.metadata.get("invocation_id") or f"harness_{uuid.uuid4().hex}")
113
- if run_id in self._runs:
114
- raise ValueError(f"duplicate Harness invocation: {run_id}")
115
- 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)
116
135
  return RunHandle(
117
136
  run_id=run_id,
118
137
  session_id=request.session_id,
@@ -160,23 +179,51 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
160
179
  )
161
180
 
162
181
  async def close(self, handle: RunHandle) -> None:
163
- 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)
164
185
  if run is not None and run.task is not None and not run.task.done():
165
186
  run.task.cancel()
166
187
  await asyncio.gather(run.task, return_exceptions=True)
167
- if not self._runs:
188
+ if not has_runs:
168
189
  await self._close_tools()
169
190
 
191
+ async def close_all(self) -> None:
192
+ """Dispose every process-local run owned by this adapter instance."""
193
+
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()
205
+
170
206
  def is_handle_attached(self, handle: RunHandle) -> bool:
171
207
  return handle.run_id in self._runs
172
208
 
173
209
  async def execute_request(self, request: StartRequest) -> dict[str, Any]:
210
+ session = self._session_for(request)
211
+ async with session.lock:
212
+ return await self._execute_session_request(request, session)
213
+
214
+ async def _execute_session_request(
215
+ self,
216
+ request: StartRequest,
217
+ session: _HarnessSession,
218
+ ) -> dict[str, Any]:
174
219
  tools = await self._ensure_tools()
175
220
  model, prompt = self._effective(request)
176
221
  messages: list[dict[str, Any]] = [
177
222
  {"role": "system", "content": prompt},
178
- {"role": "user", "content": str(request.input or "")},
223
+ *[dict(message) for message in session.messages],
179
224
  ]
225
+ user_message = {"role": "user", "content": str(request.input or "")}
226
+ messages.append(user_message)
180
227
  execution_log: list[dict[str, Any]] = []
181
228
 
182
229
  for _turn_number in range(_MAX_REASONING_TURNS):
@@ -235,6 +282,12 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
235
282
  raise RuntimeError(
236
283
  "Harness reasoner returned neither a final response nor a tool call"
237
284
  )
285
+ final_message = {"role": "assistant", "content": turn.final_text}
286
+ messages.append(final_message)
287
+ # Failed or cancelled turns never commit a partial transcript.
288
+ # A successful turn atomically replaces the process-local history
289
+ # while the per-session lock is still held.
290
+ session.messages[:] = [dict(message) for message in messages[1:]]
238
291
  return {
239
292
  "output": turn.final_text,
240
293
  "model": model,
@@ -244,11 +297,21 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
244
297
  }
245
298
  raise RuntimeError(f"Harness reasoning exceeded {_MAX_REASONING_TURNS} turns")
246
299
 
300
+ def _session_for(self, request: StartRequest) -> _HarnessSession:
301
+ key = (
302
+ str(request.agent_id or self._agent_name),
303
+ str(request.user_id),
304
+ str(request.session_id),
305
+ )
306
+ session = self._sessions.get(key)
307
+ if session is None:
308
+ session = _HarnessSession(messages=[], lock=asyncio.Lock())
309
+ self._sessions[key] = session
310
+ return session
311
+
247
312
  def _effective(self, request: StartRequest) -> tuple[str, str]:
248
313
  metadata = request.metadata or {}
249
- model = str(
250
- metadata.get("model_override") or request.model or self._config.model
251
- ).strip()
314
+ model = str(metadata.get("model_override") or request.model or self._config.model).strip()
252
315
  prompt = str(
253
316
  metadata.get("prompt_override")
254
317
  or request.config.get("base_instructions")
@@ -285,9 +348,7 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
285
348
  },
286
349
  )
287
350
 
288
- def env_kwargs(
289
- item_id: str, event_type: str, part_id: str
290
- ) -> dict[str, Any]:
351
+ def env_kwargs(item_id: str, event_type: str, part_id: str) -> dict[str, Any]:
291
352
  n = next_seq()
292
353
  return {
293
354
  "schema_version": 2,
@@ -386,9 +447,7 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
386
447
  **env_kwargs(message_item_id, "item.completed", "text-0"),
387
448
  item_id=message_item_id,
388
449
  item_kind="message",
389
- snapshot=ContentSnapshot(
390
- parts=(TextContent(part_id="text-0", text=text),)
391
- ),
450
+ snapshot=ContentSnapshot(parts=(TextContent(part_id="text-0", text=text),)),
392
451
  )
393
452
  run.done = True
394
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,