agentengine-sdk-python 0.8.1__py3-none-any.whl → 0.8.2__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 (411) hide show
  1. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +22 -2
  2. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/RECORD +356 -222
  3. ksadk/a2a/_space_client_events.py +381 -0
  4. ksadk/a2a/event_adapter.py +156 -64
  5. ksadk/a2a/executor.py +179 -63
  6. ksadk/a2a/space_client.py +6 -333
  7. ksadk/a2ui/core.py +222 -53
  8. ksadk/agui/_agent_helpers.py +243 -0
  9. ksadk/agui/a2ui_projection.py +12 -5
  10. ksadk/agui/agent.py +443 -259
  11. ksadk/api/client.py +525 -27
  12. ksadk/builders/code_builder.py +284 -8
  13. ksadk/builders/container_builder.py +8 -1
  14. ksadk/builders/managed_runtime_builder.py +39 -35
  15. ksadk/cli/__init__.py +17 -0
  16. ksadk/cli/cmd_dashboard.py +15 -1
  17. ksadk/cli/cmd_deploy.py +10 -2
  18. ksadk/cli/cmd_eval.py +66 -9
  19. ksadk/cli/cmd_evalset.py +284 -0
  20. ksadk/cli/cmd_files.py +5 -1
  21. ksadk/cli/cmd_hermes.py +1 -126
  22. ksadk/cli/cmd_invoke.py +28 -38
  23. ksadk/cli/cmd_managed_runtime.py +95 -0
  24. ksadk/cli/cmd_observe.py +85 -0
  25. ksadk/cli/cmd_openclaw.py +1 -435
  26. ksadk/cli/cmd_replay.py +28 -4
  27. ksadk/cli/cmd_studio.py +99 -8
  28. ksadk/cli/cmd_web.py +10 -2
  29. ksadk/cli/hermes_env.py +151 -0
  30. ksadk/cli/invoke_payload.py +49 -0
  31. ksadk/cli/openclaw_env.py +458 -0
  32. ksadk/codex/client.py +180 -30
  33. ksadk/codex/runtime.py +428 -326
  34. ksadk/configs/env_registry.py +66 -12
  35. ksadk/configs/env_registry_pcm.py +181 -0
  36. ksadk/configs/env_var_spec.py +18 -0
  37. ksadk/configs/global_config.py +5 -0
  38. ksadk/context_engine/__init__.py +98 -0
  39. ksadk/context_engine/assembler.py +176 -0
  40. ksadk/context_engine/baseline.py +419 -0
  41. ksadk/context_engine/cache_observability.py +228 -0
  42. ksadk/context_engine/capabilities.py +443 -0
  43. ksadk/context_engine/contributors.py +344 -0
  44. ksadk/context_engine/hosted_pipeline.py +417 -0
  45. ksadk/context_engine/models.py +117 -0
  46. ksadk/context_engine/planner.py +698 -0
  47. ksadk/context_engine/policies.py +319 -0
  48. ksadk/context_engine/projection.py +31 -0
  49. ksadk/context_engine/shadow_plan.py +266 -0
  50. ksadk/context_engine/tokenizer.py +164 -0
  51. ksadk/conversations/context.py +126 -6
  52. ksadk/conversations/message_projection.py +292 -28
  53. ksadk/conversations/model_context.py +49 -3
  54. ksadk/conversations/runtime_compaction.py +207 -5
  55. ksadk/conversations/runtime_input.py +184 -2
  56. ksadk/conversations/runtime_invocation.py +81 -3
  57. ksadk/conversations/runtime_observability.py +141 -0
  58. ksadk/conversations/runtime_payloads.py +42 -0
  59. ksadk/conversations/runtime_preparation.py +272 -2
  60. ksadk/conversations/runtime_resume.py +20 -1
  61. ksadk/conversations/runtime_stream_events.py +94 -9
  62. ksadk/conversations/semantic_summary.py +311 -1
  63. ksadk/conversations/session_lock.py +51 -0
  64. ksadk/deployment/env_forward.py +72 -0
  65. ksadk/deployment/managed_runtime.py +5 -0
  66. ksadk/deployment/providers/serverless.py +143 -69
  67. ksadk/evaluation/__init__.py +32 -0
  68. ksadk/evaluation/a2a_adapter.py +9 -1
  69. ksadk/evaluation/adapters.py +18 -5
  70. ksadk/evaluation/agent_eval_client.py +395 -0
  71. ksadk/evaluation/cloud_binding.py +80 -0
  72. ksadk/evaluation/cloud_converter.py +194 -0
  73. ksadk/evaluation/cloud_service.py +199 -0
  74. ksadk/evaluation/contracts.py +73 -4
  75. ksadk/evaluation/evaluators.py +183 -17
  76. ksadk/evaluation/evidence.py +258 -0
  77. ksadk/evaluation/executor.py +31 -6
  78. ksadk/evaluation/local_adapter.py +550 -0
  79. ksadk/evaluation/service_env.py +27 -0
  80. ksadk/evaluation/studio_build_adapter.py +253 -0
  81. ksadk/evaluation/target.py +15 -6
  82. ksadk/events/__init__.py +13 -13
  83. ksadk/events/_v1_compat/__init__.py +1 -0
  84. ksadk/events/_v1_compat/models.py +299 -0
  85. ksadk/events/_v1_compat/parser.py +247 -0
  86. ksadk/events/_v1_compat/projection.py +753 -0
  87. ksadk/events/adapters/__init__.py +34 -0
  88. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  89. ksadk/events/adapters/_a2a_support.py +275 -0
  90. ksadk/events/adapters/_codex_interactions.py +375 -0
  91. ksadk/events/adapters/_codex_items.py +801 -0
  92. ksadk/events/adapters/_codex_validators.py +311 -0
  93. ksadk/events/adapters/_langgraph_support.py +785 -0
  94. ksadk/events/adapters/a2a.py +841 -0
  95. ksadk/events/adapters/adk.py +503 -0
  96. ksadk/events/adapters/codex.py +717 -0
  97. ksadk/events/adapters/langgraph.py +745 -0
  98. ksadk/events/canonical.py +440 -0
  99. ksadk/events/canonical_replay.py +497 -0
  100. ksadk/events/canonical_store.py +468 -0
  101. ksadk/events/cold_recovery.py +257 -0
  102. ksadk/events/content.py +89 -0
  103. ksadk/events/identity.py +86 -0
  104. ksadk/events/pipeline.py +455 -0
  105. ksadk/events/projections.py +66 -0
  106. ksadk/events/reducer.py +661 -0
  107. ksadk/events/replay.py +3 -36
  108. ksadk/events/runtime_event.py +20 -265
  109. ksadk/events/session_event.py +324 -0
  110. ksadk/events/store.py +3 -316
  111. ksadk/events/v1_compat.py +41 -0
  112. ksadk/harness/runtime.py +160 -57
  113. ksadk/identity/resolver.py +4 -3
  114. ksadk/interaction/__init__.py +28 -0
  115. ksadk/interaction/contracts.py +136 -0
  116. ksadk/interaction/ledger.py +189 -0
  117. ksadk/interaction/provider.py +122 -0
  118. ksadk/interaction/providers/__init__.py +52 -0
  119. ksadk/interaction/providers/adk.py +40 -0
  120. ksadk/interaction/providers/codex.py +94 -0
  121. ksadk/interaction/providers/langgraph.py +58 -0
  122. ksadk/kernel/__init__.py +117 -0
  123. ksadk/kernel/authorization.py +258 -0
  124. ksadk/kernel/bootstrap.py +1074 -0
  125. ksadk/kernel/contract_fingerprints.py +61 -0
  126. ksadk/kernel/contracts.py +362 -0
  127. ksadk/kernel/control.py +219 -0
  128. ksadk/kernel/errors.py +79 -0
  129. ksadk/kernel/ingress.py +1102 -0
  130. ksadk/kernel/mapping.py +111 -0
  131. ksadk/kernel/memory_store.py +1133 -0
  132. ksadk/kernel/postgres_store.py +1756 -0
  133. ksadk/kernel/recovery.py +452 -0
  134. ksadk/kernel/runtime_identity.py +103 -0
  135. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  136. ksadk/kernel/sqlite_store.py +1410 -0
  137. ksadk/kernel/state.py +145 -0
  138. ksadk/kernel/store.py +232 -0
  139. ksadk/kernel/worker.py +953 -0
  140. ksadk/knowledge_base/client.py +7 -0
  141. ksadk/knowledge_base/service.py +32 -5
  142. ksadk/memory/__init__.py +61 -0
  143. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  144. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  145. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  146. ksadk/memory/adk/backends/sdk_ltm_backend.py +384 -2
  147. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  148. ksadk/memory/coordinator.py +461 -0
  149. ksadk/memory/events.py +202 -0
  150. ksadk/memory/extraction.py +228 -0
  151. ksadk/memory/ltm_backend_factory.py +16 -3
  152. ksadk/memory/models.py +316 -0
  153. ksadk/memory/policy.py +215 -0
  154. ksadk/memory/provider.py +47 -0
  155. ksadk/memory/provider_adapter.py +159 -0
  156. ksadk/memory/provider_resolver.py +71 -0
  157. ksadk/memory/providers/__init__.py +5 -0
  158. ksadk/memory/providers/local_sqlite.py +490 -0
  159. ksadk/memory/resolved_policy.py +145 -0
  160. ksadk/memory/service.py +188 -6
  161. ksadk/model_proxy/bootstrap.py +16 -9
  162. ksadk/model_proxy/detect.py +202 -9
  163. ksadk/model_proxy/namespace.py +39 -15
  164. ksadk/model_proxy/server.py +24 -5
  165. ksadk/model_proxy/transform.py +60 -2
  166. ksadk/observability/__init__.py +25 -0
  167. ksadk/observability/session_log.py +420 -0
  168. ksadk/observability/trajectory.py +105 -0
  169. ksadk/prompts/__init__.py +71 -0
  170. ksadk/prompts/compiler.py +215 -0
  171. ksadk/prompts/models.py +82 -0
  172. ksadk/prompts/projection.py +89 -0
  173. ksadk/prompts/resolved.py +137 -0
  174. ksadk/prompts/sources.py +233 -0
  175. ksadk/runners/_langgraph_runner_streams.py +822 -0
  176. ksadk/runners/adk_runner.py +5 -5
  177. ksadk/runners/base_runner.py +16 -0
  178. ksadk/runners/factory.py +1 -2
  179. ksadk/runners/langgraph_runner.py +198 -437
  180. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  181. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  182. ksadk/runtime/adapter.py +118 -2
  183. ksadk/runtime/conversation_execution.py +316 -182
  184. ksadk/runtime/executor.py +144 -3
  185. ksadk/runtime/factory.py +193 -7
  186. ksadk/runtime/hosted_finalizer.py +268 -0
  187. ksadk/runtime/launch.py +14 -1
  188. ksadk/runtime/preprocessing.py +25 -3
  189. ksadk/runtime/runner_adapter.py +288 -508
  190. ksadk/runtime/usage.py +33 -0
  191. ksadk/sandbox/backends/e2b.py +35 -2
  192. ksadk/server/composition.py +8 -0
  193. ksadk/server/factory.py +69 -6
  194. ksadk/server/routes/kernel_ingress.py +258 -0
  195. ksadk/server/routes/openai_compat.py +88 -8
  196. ksadk/server/routes/projection.py +35 -20
  197. ksadk/server/routes/run.py +94 -0
  198. ksadk/server/routes/sessions.py +2 -0
  199. ksadk/server/routes/streaming.py +5 -2
  200. ksadk/server/static/assets/{ArtifactsPanel-CakCqxEN.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  201. ksadk/server/static/assets/{CodeBlock-CynLknyO.js → CodeBlock-DOH6MVcn.js} +4 -4
  202. ksadk/server/static/assets/{MathMessageMarkdown-3sQdOysS.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  203. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  204. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  205. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  206. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  207. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  208. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  209. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  210. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  211. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  212. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  213. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  214. ksadk/server/static/assets/{chunk-FMBD7UC4-B_fH2YuH.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  215. ksadk/server/static/assets/{chunk-ND2GUHAM-D6rFLaVV.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  216. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  217. ksadk/server/static/assets/{chunk-4BX2VUAB-B9drTgOW.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  218. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  219. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  220. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  221. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  222. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  223. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  224. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  225. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-ChNs_Mdk.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  226. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  227. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  228. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  229. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  230. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  231. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  232. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  233. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  234. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  235. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  236. ksadk/server/static/assets/{dist-Dli7qW-B.js → dist-8hqcx0sU.js} +1 -1
  237. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  238. ksadk/server/static/assets/{dist-C1sz5Eo3.js → dist-BE7bu-DL.js} +1 -1
  239. ksadk/server/static/assets/{dist-fhOuWds5.js → dist-BVDffZ0U.js} +1 -1
  240. ksadk/server/static/assets/{dist-BjOdlDjj.js → dist-BX8z72IC.js} +1 -1
  241. ksadk/server/static/assets/{dist-DsHPdk3W.js → dist-Bf2M8m3N.js} +1 -1
  242. ksadk/server/static/assets/{dist-o2OVmKvt.js → dist-BjU6y-A2.js} +1 -1
  243. ksadk/server/static/assets/{dist-DWKByxWV.js → dist-BytlxIDT.js} +1 -1
  244. ksadk/server/static/assets/{dist-DJN_6Y39.js → dist-CSh_DE14.js} +1 -1
  245. ksadk/server/static/assets/{dist-DQU9EWw-.js → dist-CXYYBw3_.js} +1 -1
  246. ksadk/server/static/assets/{dist-4N2NMVYg.js → dist-C_wsv-Qd.js} +1 -1
  247. ksadk/server/static/assets/{dist-gLnrGsoU.js → dist-ClxGviKw.js} +1 -1
  248. ksadk/server/static/assets/{dist-j6Dxmf_j.js → dist-CttYUqzS.js} +1 -1
  249. ksadk/server/static/assets/{dist-D6MpCZtz.js → dist-DNp6rLRA.js} +1 -1
  250. ksadk/server/static/assets/{dist-BB3-OwTQ.js → dist-DUX-id_F.js} +1 -1
  251. ksadk/server/static/assets/{dist-_pHPTyZ-.js → dist-DmldrHd_.js} +1 -1
  252. ksadk/server/static/assets/{dist-CWV4lDr1.js → dist-DnfXs8Vn.js} +2 -2
  253. ksadk/server/static/assets/{dist-B5oS1zcj.js → dist-Dq9gLD7L.js} +1 -1
  254. ksadk/server/static/assets/{dist-B-jNR6Vn.js → dist-W-TIVntx.js} +1 -1
  255. ksadk/server/static/assets/{dist-BIlKoW0k.js → dist-dDdADKFA.js} +1 -1
  256. ksadk/server/static/assets/{dist-X4TnqwOK.js → dist-dydu68Fl.js} +1 -1
  257. ksadk/server/static/assets/{dist-CmZHzlwZ.js → dist-ngtN0DJB.js} +1 -1
  258. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  259. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  260. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  261. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  262. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  263. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  264. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  265. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  266. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  267. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  268. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  269. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-K0OOfVna.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  270. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-8LeOJaZp.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  271. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-C6uCgZrW.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  272. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  273. ksadk/server/static/assets/{linear-hdBcYzM8.js → linear-BHjG8b-J.js} +1 -1
  274. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  275. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-Bjy_2v4_.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  276. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  277. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  278. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  279. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  280. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-BmkRbwCg.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  281. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  282. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  283. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  284. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  285. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  286. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  287. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  288. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-l6iXmU65.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  289. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-Cq6UBeQB.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  290. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  291. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  292. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  293. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  294. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  295. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-DEz24vV0.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  296. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  297. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  298. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  299. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  300. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  301. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  302. ksadk/server/static/index.html +2 -2
  303. ksadk/sessions/__init__.py +26 -9
  304. ksadk/sessions/_local_service_sync.py +688 -0
  305. ksadk/sessions/_local_tables.py +21 -0
  306. ksadk/sessions/_postgres_schema.py +305 -0
  307. ksadk/sessions/_postgres_tables.py +15 -0
  308. ksadk/sessions/base.py +80 -1
  309. ksadk/sessions/in_memory.py +53 -2
  310. ksadk/sessions/local_service.py +63 -604
  311. ksadk/sessions/postgres_service.py +58 -148
  312. ksadk/sessions/resilient.py +35 -1
  313. ksadk/studio/api.py +577 -25
  314. ksadk/studio/api_contracts.py +114 -5
  315. ksadk/studio/api_memory_routes.py +82 -0
  316. ksadk/studio/authoring.py +252 -27
  317. ksadk/studio/authoring_coordinator.py +799 -67
  318. ksadk/studio/builder.py +88 -11
  319. ksadk/studio/capabilities.py +17 -0
  320. ksadk/studio/cloud.py +1916 -95
  321. ksadk/studio/codex_agent_service.py +125 -14
  322. ksadk/studio/codex_authoring.py +469 -0
  323. ksadk/studio/codex_builder.py +138 -25
  324. ksadk/studio/codex_manifest.py +51 -22
  325. ksadk/studio/codex_run.py +46 -3
  326. ksadk/studio/compiler.py +1 -0
  327. ksadk/studio/contracts.py +114 -3
  328. ksadk/studio/event_store.py +25 -95
  329. ksadk/studio/framework_run.py +231 -3
  330. ksadk/studio/hosted_kernel.py +317 -0
  331. ksadk/studio/manifest_resolver.py +131 -0
  332. ksadk/studio/model_client.py +95 -9
  333. ksadk/studio/model_profile_service.py +1 -1
  334. ksadk/studio/operations.py +37 -5
  335. ksadk/studio/otel_trace.py +348 -42
  336. ksadk/studio/pcm_memory.py +85 -0
  337. ksadk/studio/repository.py +23 -2
  338. ksadk/studio/resource_catalog.py +43 -0
  339. ksadk/studio/run_service.py +563 -137
  340. ksadk/studio/runtime_source.py +42 -16
  341. ksadk/studio/service.py +1180 -72
  342. ksadk/studio/shared_web.py +32 -22
  343. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  344. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  345. ksadk/studio/static/index.html +2 -2
  346. ksadk/studio/templates.py +100 -8
  347. ksadk/studio/validator.py +19 -0
  348. ksadk/studio/workspace.py +30 -32
  349. ksadk/tracing/setup.py +304 -3
  350. ksadk/version.py +1 -1
  351. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  352. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  353. ksadk/events/parser.py +0 -191
  354. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  355. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +0 -303
  356. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +0 -1
  357. ksadk/server/static/assets/arc-DrgjcKhl.js +0 -1
  358. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +0 -1
  359. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-BXoVRbQ6.js +0 -36
  360. ksadk/server/static/assets/blockDiagram-GPEHLZMM-BnaB3Ywv.js +0 -132
  361. ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dw4weZcp.js +0 -10
  362. ksadk/server/static/assets/channel-Dt3rQTFI.js +0 -1
  363. ksadk/server/static/assets/chunk-2J33WTMH-ChjpLK7j.js +0 -1
  364. ksadk/server/static/assets/chunk-55IACEB6-CK4ROATy.js +0 -1
  365. ksadk/server/static/assets/chunk-727SXJPM-B9KtTTgw.js +0 -206
  366. ksadk/server/static/assets/chunk-AQP2D5EJ-1O1mki3m.js +0 -231
  367. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +0 -1
  368. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +0 -1
  369. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +0 -1
  370. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  371. ksadk/server/static/assets/dagre-BM42HDAG-D0QXg_MQ.js +0 -4
  372. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  373. ksadk/server/static/assets/diagram-2AECGRRQ-DBDDKwBQ.js +0 -43
  374. ksadk/server/static/assets/diagram-5GNKFQAL-BkwDOxmO.js +0 -10
  375. ksadk/server/static/assets/diagram-KO2AKTUF-Bv8waYvY.js +0 -3
  376. ksadk/server/static/assets/diagram-LMA3HP47-e1VECDdu.js +0 -24
  377. ksadk/server/static/assets/diagram-OG6HWLK6-Ds9adfRl.js +0 -24
  378. ksadk/server/static/assets/dist-B5J2uhNk.js +0 -1
  379. ksadk/server/static/assets/erDiagram-TEJ5UH35-BPItFKH6.js +0 -85
  380. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +0 -1
  381. ksadk/server/static/assets/flowDiagram-I6XJVG4X-BbYB9w5Y.js +0 -162
  382. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-TQXa0KXv.js +0 -292
  383. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +0 -1
  384. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-bKblCnpa.js +0 -106
  385. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  386. ksadk/server/static/assets/index-R52pJJvg.js +0 -177
  387. ksadk/server/static/assets/index-jJr3_955.css +0 -2
  388. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +0 -1
  389. ksadk/server/static/assets/infoDiagram-5YYISTIA-BGVT7J_i.js +0 -2
  390. ksadk/server/static/assets/katex-CYWseY5E.js +0 -265
  391. ksadk/server/static/assets/mermaid-parser.core-BWrDjSZM.js +0 -161
  392. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +0 -1
  393. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +0 -1
  394. ksadk/server/static/assets/pieDiagram-4H26LBE5-GmmqNiVH.js +0 -30
  395. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +0 -1
  396. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DSWFqL7c.js +0 -84
  397. ksadk/server/static/assets/stateDiagram-AJRCARHV-qzTQpg3Y.js +0 -1
  398. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +0 -1
  399. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +0 -1
  400. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +0 -1
  401. ksadk/server/static/assets/vennDiagram-CIIHVFJN-CMCixki2.js +0 -34
  402. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +0 -1
  403. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-CVzB8F9K.js +0 -78
  404. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-BFBqBLc1.js +0 -7
  405. ksadk/studio/evaluation.py +0 -192
  406. ksadk/studio/static/assets/index-CaEN0eTR.css +0 -1
  407. ksadk/studio/static/assets/index-DI2eY_NH.js +0 -252
  408. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +0 -0
  409. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  410. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  411. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
ksadk/runtime/executor.py CHANGED
@@ -1,9 +1,17 @@
1
- """RuntimeAdapter 的统一生命周期路由与 Handle 所有权。"""
1
+ """RuntimeAdapter 的统一生命周期路由与 Handle 所有权。
2
+
3
+ ``_runs`` 只是当前进程的 handle cache:status、幂等、恢复资格和 owner 判断的
4
+ 真相在 ``AgentKernelStore`` 的 durable Run 行;cache miss 不能等价于 Run 不
5
+ 存在(见 :meth:`RuntimeExecutor.resolve_run`)。
6
+ """
2
7
 
3
8
  from __future__ import annotations
4
9
 
10
+ import hashlib
11
+ import json
5
12
  from contextlib import suppress
6
13
  from dataclasses import dataclass
14
+ from typing import TYPE_CHECKING
7
15
 
8
16
  from ksadk.runtime.adapter import (
9
17
  CancelResult,
@@ -18,9 +26,28 @@ from ksadk.runtime.adapter import (
18
26
  )
19
27
  from ksadk.runtime.launch import RuntimeLaunchContext
20
28
 
29
+ if TYPE_CHECKING: # pragma: no cover - import cycle guard
30
+ from ksadk.kernel.store import AgentKernelStore, RunRecord
31
+
21
32
  _HandleKey = tuple[str, str, str]
22
33
 
23
34
 
35
+ class RunNotFoundError(LookupError):
36
+ """durable Store 中不存在该 Run;cache miss 不是证据,必须查 Store。"""
37
+
38
+ def __init__(self, run_id: str) -> None:
39
+ super().__init__(f"durable run not found: {run_id!r}")
40
+ self.run_id = run_id
41
+
42
+
43
+ @dataclass
44
+ class DurableRun:
45
+ """Store 中的 Run 真相 + 本进程 live handle(可能未 attach)。"""
46
+
47
+ run: "RunRecord"
48
+ live_handle: RunHandle | None = None
49
+
50
+
24
51
  @dataclass
25
52
  class _OwnedRun:
26
53
  adapter: RuntimeAdapter
@@ -39,10 +66,58 @@ class RuntimeStartPreparation:
39
66
  class RuntimeExecutor:
40
67
  """让每个 Handle 始终回到创建或恢复它的 Adapter 实例。"""
41
68
 
42
- def __init__(self, registry: RuntimeRegistry) -> None:
69
+ def __init__(
70
+ self,
71
+ registry: RuntimeRegistry,
72
+ *,
73
+ kernel_store: "AgentKernelStore | None" = None,
74
+ ) -> None:
43
75
  self._registry = registry
76
+ self._kernel_store = kernel_store
44
77
  self._runs: dict[_HandleKey, _OwnedRun] = {}
45
78
 
79
+ def create_adapter(self, context: RuntimeLaunchContext) -> RuntimeAdapter:
80
+ """从本 executor 的 registry 创建一个 adapter。
81
+
82
+ 生产 composition root 需要为 AgentKernelWorker 提供 adapter factory。
83
+ 暴露这个窄入口可避免其绕过当前 RuntimeExecutor、另建默认 registry,
84
+ 从而让普通执行、worker 与恢复走同一套 runtime-type 注册表。
85
+ """
86
+
87
+ return self._registry.create(context)
88
+
89
+ async def resolve_run(self, run_id: str) -> DurableRun:
90
+ """以 durable Store 为真相解析 Run;cache 只是 live handle 提示。"""
91
+
92
+ durable = None
93
+ if self._kernel_store is not None:
94
+ durable = await self._kernel_store.load_run(run_id)
95
+ if durable is None:
96
+ # 没有 Store 时只能退回 cache;cache miss 不等价于 Run 不存在,
97
+ # 因此未配置 kernel_store 的旧调用方仍需显式处理缺失。
98
+ if self._kernel_store is not None:
99
+ raise RunNotFoundError(run_id)
100
+ cached = next(
101
+ (
102
+ owned.handle
103
+ for (_, rid, _), owned in self._runs.items()
104
+ if rid == run_id
105
+ ),
106
+ None,
107
+ )
108
+ if cached is None:
109
+ raise RunNotFoundError(run_id)
110
+ return DurableRun(run=_cache_only_record(cached), live_handle=cached)
111
+ live = next(
112
+ (
113
+ owned.handle
114
+ for (_, rid, _), owned in self._runs.items()
115
+ if rid == run_id
116
+ ),
117
+ None,
118
+ )
119
+ return DurableRun(run=durable, live_handle=live)
120
+
46
121
  async def prepare_start(self, context: RuntimeLaunchContext) -> RuntimeStartPreparation:
47
122
  """Preflight a fresh adapter and retain it for the matching ``start``.
48
123
 
@@ -173,6 +248,29 @@ class RuntimeExecutor:
173
248
  self._record_owner(adapter, restored)
174
249
  return restored
175
250
 
251
+ async def attach_record(
252
+ self,
253
+ run: "RunRecord",
254
+ context: RuntimeLaunchContext,
255
+ ) -> RunHandle:
256
+ """Attach a run from its durable record (cross-process recovery path).
257
+
258
+ 一个新进程没有任何 ``_runs`` 缓存;durable Run 行的 ``handle`` +
259
+ ``handle_digest`` 是唯一恢复线索。digest 不匹配即拒绝——被篡改或
260
+ 版本漂移的 handle 绝不能接回 live 执行。
261
+ """
262
+
263
+ handle_dump = run.metadata.get("handle")
264
+ digest = run.metadata.get("handle_digest")
265
+ if not isinstance(handle_dump, dict) or not isinstance(digest, str):
266
+ raise ValueError(
267
+ f"durable run {run.run_id!r} has no durably attachable handle"
268
+ )
269
+ handle = RunHandle.model_validate(handle_dump)
270
+ if handle_digest(handle) != digest:
271
+ raise ValueError(f"handle digest mismatch for run {run.run_id!r}")
272
+ return await self.attach(context, handle)
273
+
176
274
  def is_attached(self, handle: RunHandle) -> bool:
177
275
  owned = self._runs.get(_handle_key(handle))
178
276
  return owned is not None and owned.handle == handle
@@ -200,6 +298,17 @@ class RuntimeExecutor:
200
298
  adapter = self._registry.create(context)
201
299
  return dict(adapter.runtime.native_capabilities())
202
300
 
301
+ def capability_matrix(self, context: RuntimeLaunchContext) -> dict[str, object]:
302
+ """Return the canonical typed RuntimeCapabilityMatrix/v1 projection.
303
+
304
+ ``native_capabilities`` is a compatibility view whose shape varies by
305
+ framework. UI clients need the versioned matrix so optional execution
306
+ modes can be exposed only when the selected runtime declares support.
307
+ """
308
+
309
+ adapter = self._registry.create(context)
310
+ return adapter.capabilities().model_dump(mode="json")
311
+
203
312
  def registered_runtime_types(self) -> list[str]:
204
313
  """Expose Registry membership without leaking or duplicating the Registry."""
205
314
 
@@ -236,6 +345,32 @@ class RuntimeExecutor:
236
345
  return preparation.adapter
237
346
 
238
347
 
348
+ def handle_digest(handle: RunHandle) -> str:
349
+ """Stable digest of one durable handle (cross-process recovery evidence)."""
350
+
351
+ payload = json.dumps(
352
+ handle.model_dump(mode="json"),
353
+ sort_keys=True,
354
+ separators=(",", ":"),
355
+ ensure_ascii=False,
356
+ ).encode("utf-8")
357
+ return hashlib.sha256(payload).hexdigest()
358
+
359
+
360
+ def _cache_only_record(handle: RunHandle) -> "RunRecord":
361
+ from ksadk.kernel.state import RunState
362
+ from ksadk.kernel.store import RunRecord
363
+
364
+ # 无 kernel_store 的旧调用方路径:state 只能标记 pending,真相以 Store 为准。
365
+ return RunRecord(
366
+ run_id=handle.run_id,
367
+ agent_instance_id="",
368
+ session_id=handle.session_id,
369
+ state=RunState.PENDING,
370
+ metadata={"source": "process_cache", "runtime_type": handle.runtime_type},
371
+ )
372
+
373
+
239
374
  def _normalize_runtime_type(runtime_type: str) -> str:
240
375
  return runtime_type.strip().lower()
241
376
 
@@ -248,4 +383,10 @@ def _handle_key(handle: RunHandle) -> _HandleKey:
248
383
  )
249
384
 
250
385
 
251
- __all__ = ["RuntimeExecutor", "RuntimeStartPreparation"]
386
+ __all__ = [
387
+ "RuntimeExecutor",
388
+ "RuntimeStartPreparation",
389
+ "DurableRun",
390
+ "RunNotFoundError",
391
+ "handle_digest",
392
+ ]
ksadk/runtime/factory.py CHANGED
@@ -4,20 +4,168 @@ from __future__ import annotations
4
4
 
5
5
  import dataclasses
6
6
  import os
7
+ import tempfile
7
8
  from pathlib import Path
8
9
  from typing import Any
9
10
 
10
11
  from ksadk.codex.client import AsyncCodexClient
11
12
  from ksadk.codex.runtime import CodexRuntimeAdapter
12
13
  from ksadk.runners.base_runner import BaseRunner
14
+ from ksadk.runtime.adapter import StartRequest
13
15
  from ksadk.runtime.adapter import RuntimeAdapter, RuntimeRegistry
14
16
  from ksadk.runtime.framework_adapters import ADKRuntimeAdapter, LangGraphRuntimeAdapter
15
17
  from ksadk.runtime.launch import RuntimeLaunchContext
16
18
 
17
19
 
20
+ def kernel_start_request_defaults(context: RuntimeLaunchContext) -> dict[str, Any]:
21
+ """Project an admitted launch manifest into immutable Kernel turn defaults.
22
+
23
+ The durable Kernel owns enqueue ordering, while the deployment manifest
24
+ owns model, instructions, sandbox and approval policy. Keeping this
25
+ projection beside the RuntimeAdapter factory prevents the Kernel ingress
26
+ from trusting caller-supplied execution policy.
27
+ """
28
+
29
+ config = dict(context.config)
30
+ defaults: dict[str, Any] = {}
31
+ detection_name = str(getattr(context.detection, "name", "") or "").strip()
32
+ if detection_name:
33
+ defaults["agent_id"] = detection_name
34
+ model = str(config.get("model") or "").strip()
35
+ if model:
36
+ defaults["model"] = model
37
+ raw_allowed_models = (
38
+ config.get("models") or config.get("allowed_models") or config.get("allowedModels") or []
39
+ )
40
+ allowed_models = (
41
+ {str(item).strip() for item in raw_allowed_models if str(item).strip()}
42
+ if isinstance(raw_allowed_models, (list, tuple, set))
43
+ else set()
44
+ )
45
+ # 不把默认 model 自动加进白名单:白名单只在显式声明 models/allowedModels
46
+ # 时才存在(显式声明 = 收紧;只配默认 = 不限制 run 级覆盖)。
47
+ if allowed_models:
48
+ defaults["allowed_models"] = sorted(allowed_models)
49
+ if context.runtime_type != "codex":
50
+ return defaults
51
+
52
+ prompt = str(config.get("prompt") or "").strip()
53
+ task_prompt = str(config.get("task_prompt") or "").strip()
54
+ base_instructions = prompt
55
+ if task_prompt:
56
+ base_instructions = f"{prompt}\n\n{task_prompt}" if prompt else task_prompt
57
+
58
+ raw_sandbox = str(config.get("sandbox") or "read_only").strip().lower()
59
+ raw_approval = str(config.get("approval_mode") or "").strip().lower()
60
+ approval_profiles = {
61
+ "ask": ("workspace-write", "manual"),
62
+ "risk": ("workspace-write", "auto_review"),
63
+ "full": ("full-access", "deny_all"),
64
+ }
65
+ sandbox_profiles = {
66
+ "read_only": ("read-only", "deny_all"),
67
+ "read-only": ("read-only", "deny_all"),
68
+ "workspace_write": ("workspace-write", "deny_all"),
69
+ "workspace-write": ("workspace-write", "deny_all"),
70
+ "workspace_write_auto": ("workspace-write", "auto_review"),
71
+ "workspace-write-auto": ("workspace-write", "auto_review"),
72
+ "full_access": ("full-access", "deny_all"),
73
+ "full-access": ("full-access", "deny_all"),
74
+ }
75
+ if raw_approval in approval_profiles:
76
+ sandbox, approval = approval_profiles[raw_approval]
77
+ else:
78
+ sandbox, default_approval = sandbox_profiles.get(raw_sandbox, ("read-only", "deny_all"))
79
+ approval = raw_approval or default_approval
80
+
81
+ request_config: dict[str, Any] = {
82
+ "sandbox_read_only": sandbox == "read-only",
83
+ "sandbox": sandbox,
84
+ "approval_mode": approval,
85
+ "cwd": str(context.project_dir),
86
+ "summary": "auto",
87
+ "ephemeral": False,
88
+ }
89
+ if base_instructions:
90
+ request_config["base_instructions"] = base_instructions
91
+ defaults["config"] = request_config
92
+ return defaults
93
+
94
+
95
+ def apply_runtime_start_request_defaults(
96
+ context: RuntimeLaunchContext,
97
+ request: StartRequest,
98
+ ) -> StartRequest:
99
+ """Apply deployment-owned launch policy to a direct runtime start.
100
+
101
+ AgentKernelWorker already projects these defaults before ``adapter.start``.
102
+ Foreground RunAgent, ``/run_sse`` and OpenAI-compatible routes also create
103
+ ``StartRequest`` objects directly, so they must use the same projection or
104
+ a deployed Codex agent silently falls back to the generic Codex role.
105
+
106
+ Request-local config is internal runtime state, not caller-owned policy;
107
+ retain it for local Studio builds while using the manifest model as the
108
+ fallback (and as the fail-closed fallback for an explicit allow-list).
109
+ """
110
+
111
+ defaults = kernel_start_request_defaults(context)
112
+ default_model = str(defaults.get("model") or "").strip() or None
113
+ requested_model = str(request.model or "").strip()
114
+ allowed_models = {
115
+ str(item).strip()
116
+ for item in (defaults.get("allowed_models") or [])
117
+ if str(item).strip()
118
+ }
119
+ selected_model = (
120
+ requested_model
121
+ if requested_model and (not allowed_models or requested_model in allowed_models)
122
+ else default_model
123
+ )
124
+ config = {
125
+ **dict(defaults.get("config") or {}),
126
+ **dict(request.config or {}),
127
+ }
128
+ return request.model_copy(
129
+ update={
130
+ "agent_id": request.agent_id or defaults.get("agent_id"),
131
+ "model": selected_model,
132
+ "config": config,
133
+ }
134
+ )
135
+
136
+
137
+ def _manifest_mcp_overrides(config: dict[str, Any]) -> list[str]:
138
+ """Translate declarative MCP bindings into native Codex config keys."""
139
+
140
+ overrides: list[str] = []
141
+ servers = config.get("mcp_servers") or []
142
+ if not isinstance(servers, (list, tuple)):
143
+ return overrides
144
+ for server in servers:
145
+ if not isinstance(server, dict):
146
+ continue
147
+ name = str(server.get("name") or "").strip()
148
+ url = str(server.get("url") or "").strip()
149
+ if not name or not url:
150
+ continue
151
+ overrides.append(f"mcp_servers.{name}.url={url}")
152
+ env_key = str(server.get("env_key") or "").strip()
153
+ if env_key:
154
+ overrides.append(f"mcp_servers.{name}.bearer_token_env_var={env_key}")
155
+ return overrides
156
+
157
+
18
158
  def _create_codex(context: RuntimeLaunchContext) -> RuntimeAdapter:
19
159
  client_factory = context.services.codex_client_factory or AsyncCodexClient
20
- overrides = list(context.config.get("codex_overrides") or [])
160
+ config = dict(context.config)
161
+ overrides = list(config.get("codex_overrides") or [])
162
+ manifest_mcp_overrides = _manifest_mcp_overrides(config)
163
+ overrides.extend(item for item in manifest_mcp_overrides if item not in overrides)
164
+ projected_config = kernel_start_request_defaults(context).get("config") or {}
165
+ if manifest_mcp_overrides and projected_config.get("sandbox") == "workspace-write":
166
+ network_override = "sandbox_workspace_write.network_access=true"
167
+ if network_override not in overrides:
168
+ overrides.append(network_override)
21
169
  # Studio's default collaboration mode must expose Codex's structured
22
170
  # request_user_input tool; the upstream feature is intentionally off by
23
171
  # default outside Plan mode. This stays process-local to the isolated
@@ -60,9 +208,16 @@ def _create_codex(context: RuntimeLaunchContext) -> RuntimeAdapter:
60
208
  if overrides:
61
209
  _apply_codex_overrides(client, overrides)
62
210
  timeout = context.config.get("turn_timeout_seconds")
211
+ request_defaults = kernel_start_request_defaults(context)
212
+ request_config = request_defaults.get("config") or {}
213
+ sandbox_read_only = (
214
+ bool(context.config["sandbox_read_only"])
215
+ if "sandbox_read_only" in context.config
216
+ else bool(request_config.get("sandbox_read_only", True))
217
+ )
63
218
  return CodexRuntimeAdapter(
64
219
  client,
65
- sandbox_read_only=bool(context.config.get("sandbox_read_only", True)),
220
+ sandbox_read_only=sandbox_read_only,
66
221
  turn_timeout_seconds=float(timeout) if timeout is not None else None,
67
222
  )
68
223
 
@@ -76,10 +231,36 @@ def _isolated_codex_home(project_dir: Any) -> Path:
76
231
  """
77
232
  override = os.environ.get("KSADK_CODEX_HOME")
78
233
  if override:
79
- return Path(override).expanduser()
80
- home = Path(str(project_dir)) / ".agentkit" / "codex-home"
81
- home.mkdir(parents=True, exist_ok=True)
82
- return home
234
+ home = Path(override).expanduser()
235
+ home.mkdir(parents=True, exist_ok=True)
236
+ return home
237
+
238
+ # Source bundles are deliberately mounted read-only in managed runtimes.
239
+ # Keep the preferred workspace-local isolation for local development, but
240
+ # never make a Codex turn depend on being able to mutate that bundle.
241
+ workspace_home = Path(str(project_dir)) / ".agentkit" / "codex-home"
242
+ try:
243
+ workspace_home.mkdir(parents=True, exist_ok=True)
244
+ return workspace_home
245
+ except OSError:
246
+ pass
247
+
248
+ # The managed runtime already provides a per-workload writable state
249
+ # volume. Derive from its explicit directory first, then from the
250
+ # session-store path for backward-compatible images. /tmp is a final
251
+ # process-local fallback for custom read-only launchers.
252
+ state_dir = os.environ.get("KSADK_RUNTIME_STATE_DIR")
253
+ session_path = os.environ.get("KSADK_SESSION_PATH")
254
+ fallback_root = (
255
+ Path(state_dir)
256
+ if state_dir
257
+ else Path(session_path).expanduser().parent
258
+ if session_path
259
+ else Path(tempfile.gettempdir()) / "ksadk-runtime-state"
260
+ )
261
+ fallback_home = fallback_root / "codex-home"
262
+ fallback_home.mkdir(parents=True, exist_ok=True)
263
+ return fallback_home
83
264
 
84
265
 
85
266
  def _apply_codex_overrides(client: Any, overrides: Any) -> None:
@@ -153,4 +334,9 @@ def create_runtime_adapter(context: RuntimeLaunchContext) -> RuntimeAdapter:
153
334
  return build_default_runtime_registry().create(context)
154
335
 
155
336
 
156
- __all__ = ["build_default_runtime_registry", "create_runtime_adapter"]
337
+ __all__ = [
338
+ "apply_runtime_start_request_defaults",
339
+ "build_default_runtime_registry",
340
+ "create_runtime_adapter",
341
+ "kernel_start_request_defaults",
342
+ ]