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
@@ -0,0 +1,24 @@
1
+ """Native input projection contract consumed by the Codex lifecycle adapter."""
2
+ from __future__ import annotations
3
+
4
+ from dataclasses import dataclass
5
+ from typing import TYPE_CHECKING, Any, Protocol
6
+
7
+ if TYPE_CHECKING:
8
+ from ksadk.runtime.adapter import ResumePayload, StartRequest
9
+
10
+
11
+ @dataclass(frozen=True)
12
+ class ProjectedCodexTurn:
13
+ """SDK-ready turn input; contains no lifecycle or execution behavior."""
14
+ input: Any
15
+
16
+
17
+ class CodexTurnProjection(Protocol):
18
+ def prepare(self, request: StartRequest) -> StartRequest: ...
19
+
20
+ def project(
21
+ self, request: StartRequest | None, payload: ResumePayload | None,
22
+ ) -> ProjectedCodexTurn: ...
23
+
24
+ def close(self) -> None: ...
ksadk/codex/runtime.py CHANGED
@@ -19,19 +19,15 @@
19
19
  from __future__ import annotations
20
20
 
21
21
  import asyncio
22
- import base64
23
- import binascii
24
- import hashlib
25
22
  import json
26
23
  import logging
27
- import re
28
24
  import time
29
25
  from collections.abc import Mapping
30
26
  from dataclasses import dataclass, field
31
- from pathlib import Path
32
27
  from typing import Any, AsyncIterator, Optional
33
28
 
34
- from ksadk.codex.client import CodexClient
29
+ from ksadk.codex.client import CodexClient, CodexPluginBootstrap
30
+ from ksadk.codex.projection import CodexTurnProjection
35
31
  from ksadk.events.adapters.codex import CodexAdapterContext, CodexEventAdapter
36
32
  from ksadk.events.canonical import (
37
33
  ErrorInfo,
@@ -107,11 +103,26 @@ class CodexRuntimeAdapter(RuntimeAdapter):
107
103
  *,
108
104
  sandbox_read_only: bool = True,
109
105
  turn_timeout_seconds: Optional[float] = None,
106
+ bound_skill_paths: Mapping[str, str] | None = None,
107
+ plugin_bootstrap: CodexPluginBootstrap | None = None,
108
+ turn_projector: CodexTurnProjection | None = None,
110
109
  ) -> None:
111
110
  super().__init__(_CodexAsBaseRuntime(client))
112
111
  self._client = client
113
112
  self._sandbox_read_only = sandbox_read_only
114
113
  self._turn_timeout_seconds = turn_timeout_seconds
114
+ if turn_projector is not None and bound_skill_paths:
115
+ raise ValueError("Skill paths must be owned by the supplied turn projector")
116
+ if turn_projector is None:
117
+ # Compatibility for direct SDK construction; production factories inject
118
+ # the same official projector, never a second input implementation.
119
+ from ksadk.plugins.providers.codex_turn import CodexTurnProjector
120
+
121
+ turn_projector = CodexTurnProjector(bound_skill_paths=bound_skill_paths)
122
+ self._turn_projector = turn_projector
123
+ self._plugin_bootstrap = plugin_bootstrap
124
+ self._plugin_bootstrap_lock = asyncio.Lock()
125
+ self._plugins_bootstrapped = False
115
126
  self._threads: dict[str, _CodexThread] = {}
116
127
  self._requests: dict[str, StartRequest] = {}
117
128
  self._known_threads: set[str] = set()
@@ -147,13 +158,19 @@ class CodexRuntimeAdapter(RuntimeAdapter):
147
158
  goal=RuntimeCapability(supported=True, mode="native"),
148
159
  loop=_unavailable("codex_loop_requires_run_control_spec"),
149
160
  plan=RuntimeCapability(supported=True, mode="native"),
161
+ interaction_mode="live_submit",
150
162
  )
151
163
 
152
164
  # ---- 六动词 ----
153
165
 
154
166
  async def start(self, request: StartRequest) -> RunHandle:
167
+ # A failed bootstrap must leave no native thread behind. The success
168
+ # bit is set only after marketplace/add, every plugin/install, and the
169
+ # enabled-inventory reconciliation all complete on this same client.
170
+ await self._bootstrap_plugins_once()
155
171
  # 新 thread 由后端分配真实 thread_id(thread_start);metadata 携带的 thread_id
156
172
  # 表示接入既有 thread(resume 语义,run_turn 时按 resume 接入)。
173
+ request = self._turn_projector.prepare(request)
157
174
  provided = request.metadata.get("thread_id")
158
175
  if provided:
159
176
  thread_id = str(provided)
@@ -197,6 +214,16 @@ class CodexRuntimeAdapter(RuntimeAdapter):
197
214
  native_ref={"thread_id": thread_id, "user_id": request.user_id},
198
215
  )
199
216
 
217
+ async def _bootstrap_plugins_once(self) -> None:
218
+ config = self._plugin_bootstrap
219
+ if config is None or self._plugins_bootstrapped:
220
+ return
221
+ async with self._plugin_bootstrap_lock:
222
+ if self._plugins_bootstrapped:
223
+ return
224
+ await self._client.bootstrap_plugins(config)
225
+ self._plugins_bootstrapped = True
226
+
200
227
  def stream(self, handle: RunHandle) -> AsyncIterator[RuntimeEvent]:
201
228
  return self._stream_events(handle)
202
229
 
@@ -276,7 +303,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
276
303
  elif payload.kind == "hitl_answer":
277
304
  resolved = await self._client.resolve_interaction(
278
305
  payload.call_id,
279
- {key: value for key, value in raw.items() if key != "decision"},
306
+ raw,
280
307
  )
281
308
  else:
282
309
  raise ValueError("Codex live submit requires approval_decision or hitl_answer")
@@ -353,23 +380,50 @@ class CodexRuntimeAdapter(RuntimeAdapter):
353
380
  )
354
381
 
355
382
  async def close(self, handle: RunHandle) -> None:
383
+ self._do_not_persist.add(handle.run_id)
384
+ await self.close_all()
385
+
386
+ async def compact_session(self, thread_id: str, config: dict[str, Any]) -> dict[str, Any]:
387
+ """Compact an existing native session using this build's client."""
388
+ await self._bootstrap_plugins_once()
389
+ await self._client.resume_thread(thread_id, config)
390
+ return await self._client.compact_thread(thread_id)
391
+
392
+ async def close_all(self) -> None:
393
+ """Dispose every thread and the activation-owned App Server process.
394
+
395
+ One ``CodexRuntimeAdapter`` owns one client transport. Closing any
396
+ attached Kernel handle therefore closes the transport as a unit; this
397
+ additive helper also lets a draining AgentProvider clean up a runtime
398
+ that has been created but not started yet.
399
+ """
400
+
356
401
  if self._closed:
357
402
  return
358
403
  self._closed = True
359
- thread = self._threads.pop(handle.run_id, None)
360
- self._requests.pop(handle.run_id, None)
361
- active = thread is not None and thread.streaming and not thread.done
362
- if active:
404
+ threads = tuple(self._threads.values())
405
+ active_threads = tuple(thread for thread in threads if thread.streaming and not thread.done)
406
+ for thread in active_threads:
363
407
  thread.interrupt_event.set()
364
408
  try:
365
- if active:
409
+ for thread in active_threads:
366
410
  await self._client.interrupt_active_turn(thread.thread_id)
367
411
  finally:
368
412
  # AsyncCodex.close owns terminate/wait/kill for the app-server child.
369
- await self._client.close()
370
- self._do_not_persist.add(handle.run_id)
371
- self._known_threads.discard(handle.run_id)
372
- self._pending_cancels.discard(handle.run_id)
413
+ try:
414
+ await self._client.close()
415
+ finally:
416
+ self._turn_projector.close()
417
+ thread_ids = {
418
+ *self._known_threads,
419
+ *self._threads,
420
+ *self._requests,
421
+ }
422
+ self._do_not_persist.update(thread_ids)
423
+ self._threads.clear()
424
+ self._requests.clear()
425
+ self._known_threads.clear()
426
+ self._pending_cancels.clear()
373
427
 
374
428
  # ---- stream → RuntimeEvent(phase 翻译 + 中断竞速) ----
375
429
 
@@ -397,13 +451,10 @@ class CodexRuntimeAdapter(RuntimeAdapter):
397
451
 
398
452
  request = thread.__dict__.get("_start_request")
399
453
  resume_state = thread.__dict__.get("_resume")
400
- if request is not None:
401
- prompt = _request_prompt(request)
402
- elif resume_state is not None:
403
- prompt = _resume_prompt(resume_state.get("payload"))
404
- else:
405
- prompt = ""
406
- run_input = _build_run_input(request, prompt)
454
+ projected = self._turn_projector.project(
455
+ request, resume_state.get("payload") if resume_state is not None else None,
456
+ )
457
+ run_input = projected.input
407
458
  thread.streaming = True
408
459
  thread.turn_id = thread.turn_id or f"turn_{thread.thread_id}"
409
460
  try:
@@ -438,14 +489,12 @@ class CodexRuntimeAdapter(RuntimeAdapter):
438
489
  ) -> AsyncIterator[RuntimeEvent]:
439
490
  request = thread.__dict__.get("_start_request") or thread.__dict__.get("_request_config")
440
491
  adapter = CodexEventAdapter(
441
- known_thread_ids=(thread.thread_id,)
442
- if thread.continuation_preexisting
443
- else (),
492
+ known_thread_ids=(thread.thread_id,) if thread.continuation_preexisting else (),
444
493
  )
445
494
  context = CodexAdapterContext(run_id=self._event_run_id(handle))
446
495
  run_config: dict[str, Any] = {"sandbox_read_only": self._sandbox_read_only}
447
496
  if request is not None and request.config:
448
- for key in ("sandbox", "approval_mode", "summary", "collaboration_mode"):
497
+ for key in ("sandbox", "approval_mode", "summary", "collaboration_mode", "effort"):
449
498
  value = request.config.get(key)
450
499
  if key == "approval_mode" and value == "manual":
451
500
  continue
@@ -512,8 +561,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
512
561
  # finish promptly, close the transport *before* awaiting
513
562
  # the waiter so MessageRouter.fail_all can release it.
514
563
  drain_deadline = (
515
- asyncio.get_running_loop().time()
516
- + _INTERRUPT_DRAIN_TIMEOUT_SECONDS
564
+ asyncio.get_running_loop().time() + _INTERRUPT_DRAIN_TIMEOUT_SECONDS
517
565
  )
518
566
  while True:
519
567
  drain_remaining = max(
@@ -557,9 +605,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
557
605
  # autoApprovalReview 不产生 canonical 事件(adapter 静默),但
558
606
  # cancel 级联丢弃审批的契约依赖 runtime 的 pending 跟踪。
559
607
  chunk_method = (
560
- str((chunk or {}).get("method") or "")
561
- if isinstance(chunk, dict)
562
- else ""
608
+ str((chunk or {}).get("method") or "") if isinstance(chunk, dict) else ""
563
609
  )
564
610
  if chunk_method in {
565
611
  "item/autoApprovalReview/started",
@@ -567,9 +613,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
567
613
  }:
568
614
  review_params = chunk.get("params") or {}
569
615
  review_id = str(
570
- review_params.get("reviewId")
571
- or review_params.get("review_id")
572
- or ""
616
+ review_params.get("reviewId") or review_params.get("review_id") or ""
573
617
  )
574
618
  if review_id:
575
619
  if chunk_method.endswith("started"):
@@ -643,9 +687,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
643
687
  framework="codex",
644
688
  native_run_id=handle.run_id,
645
689
  metadata={
646
- "agent_id": (
647
- str(request.agent_id or "codex") if request is not None else "codex"
648
- ),
690
+ "agent_id": (str(request.agent_id or "codex") if request is not None else "codex"),
649
691
  "user_id": (
650
692
  request.user_id
651
693
  if request is not None
@@ -670,8 +712,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
670
712
  "user_id": str(getattr(request, "user_id", "") or "user"),
671
713
  "session_id": str(getattr(request, "session_id", "") or ""),
672
714
  "invocation_id": str(
673
- (getattr(request, "metadata", None) or {}).get("invocation_id")
674
- or ""
715
+ (getattr(request, "metadata", None) or {}).get("invocation_id") or ""
675
716
  ),
676
717
  }
677
718
  merged = {**caller_scope, **dict(event.source.metadata or {})}
@@ -706,9 +747,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
706
747
  "source": self._make_source(handle),
707
748
  }
708
749
 
709
- def _make_run_canceled(
710
- self, handle: RunHandle, *, reason: str | None = None
711
- ) -> RunCanceled:
750
+ def _make_run_canceled(self, handle: RunHandle, *, reason: str | None = None) -> RunCanceled:
712
751
  framework = "codex"
713
752
  run_id = self._event_run_id(handle)
714
753
  scope_id = stable_scope_id(framework, run_id)
@@ -744,9 +783,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
744
783
  reason=reason,
745
784
  )
746
785
 
747
- def _make_run_failed(
748
- self, handle: RunHandle, error_message: str
749
- ) -> RunFailed:
786
+ def _make_run_failed(self, handle: RunHandle, error_message: str) -> RunFailed:
750
787
  framework = "codex"
751
788
  run_id = self._event_run_id(handle)
752
789
  scope_id = stable_scope_id(framework, run_id)
@@ -800,243 +837,6 @@ async def _anext_or_stop(gen: AsyncIterator[Any]) -> Any:
800
837
  return _STREAM_STOP
801
838
 
802
839
 
803
- def _resume_prompt(payload: Optional[ResumePayload]) -> Any:
804
- if payload is None:
805
- return ""
806
- if isinstance(payload.data, str):
807
- return payload.data
808
- return json.dumps(payload.data, ensure_ascii=False, sort_keys=True)
809
-
810
-
811
- def _coerce_prompt_text(value: Any) -> Any:
812
- """把 canonical message 形态的 input 压成 SDK 可接受的文本。
813
-
814
- ``openai-codex`` 0.147 的 run input 只接受 TextInput/str;请求侧没有
815
- conversation preprocessing 时 ``request.input`` 可能是
816
- ``[{role, content}]`` 历史列表,直接透传会 ``unsupported input item``。
817
- """
818
- if isinstance(value, str) or value is None:
819
- return value
820
- if isinstance(value, dict):
821
- content = value.get("content") if "role" in value else value.get("text")
822
- if isinstance(content, str):
823
- return content
824
- if isinstance(content, dict):
825
- text = content.get("text") or content.get("content")
826
- if isinstance(text, str):
827
- return text
828
- return str(value)
829
- if isinstance(value, list):
830
- texts = [
831
- text
832
- for text in (_coerce_prompt_text(item) for item in value)
833
- if isinstance(text, str) and text
834
- ]
835
- return "\n".join(texts) if texts else str(value)
836
- return str(value)
837
-
838
-
839
- def _request_prompt(request: StartRequest) -> Any:
840
- """Render canonical conversation history for a native Codex turn.
841
-
842
- 只传 user 消息历史 + 当前 input,不传 assistant 的完整回复(避免 codex 复述历史)。
843
- assistant 回复用简短摘要代替,仅维持对话结构。
844
- """
845
- # A resumed Codex thread already owns its transcript. Re-sending Studio's
846
- # transport-neutral history would duplicate every prior turn after refresh.
847
- if str(request.metadata.get("thread_id") or "").strip():
848
- return (
849
- request.input
850
- if _is_structured_turn_input(request.input)
851
- else _coerce_prompt_text(request.input)
852
- )
853
-
854
- conversation = request.conversation_preprocessing()
855
- if conversation is None or not conversation.messages:
856
- # Keep native text/image/mention parts intact for _build_run_input().
857
- # Flattening this list turns an image dict into user-visible text.
858
- return (
859
- request.input
860
- if _is_structured_turn_input(request.input)
861
- else _coerce_prompt_text(request.input)
862
- )
863
-
864
- lines: list[str] = []
865
- for message in conversation.messages:
866
- content = message.get("content")
867
- if not isinstance(content, str):
868
- continue
869
- role = str(message.get("role") or "user").strip().lower()
870
- if role == "assistant":
871
- # 不传完整回复,只标注"已回复",避免 codex 复述
872
- summary = content[:80] + ("..." if len(content) > 80 else "")
873
- lines.append(f"[上一轮已回复: {summary}]")
874
- elif role == "user":
875
- lines.append(f"User: {content}")
876
- return "\n".join(lines) or request.input
877
-
878
-
879
- def _is_structured_turn_input(value: Any) -> bool:
880
- return isinstance(value, list) and any(
881
- isinstance(item, dict) and isinstance(item.get("type"), str)
882
- for item in value
883
- )
884
-
885
-
886
- def _build_run_input(request: Optional[StartRequest], prompt: Any) -> Any:
887
- """Compose Codex skills and native text/image/mention turn input."""
888
- try:
889
- from openai_codex import ImageInput, LocalImageInput, MentionInput, SkillInput, TextInput
890
- except ImportError:
891
- return prompt
892
- skills: list[SkillInput] = []
893
- if request is not None:
894
- raw = request.config.get("skills") if request.config else None
895
- if isinstance(raw, list):
896
- for item in raw:
897
- if not isinstance(item, dict):
898
- continue
899
- name = str(item.get("name") or "").strip()
900
- path = str(item.get("path") or "").strip()
901
- if name and path:
902
- skills.append(SkillInput(name=name, path=path))
903
- native_items: list[Any] = []
904
- raw_input = request.input if request is not None else prompt
905
- if isinstance(raw_input, list):
906
- text_replaced = False
907
- for item in raw_input:
908
- if not isinstance(item, dict):
909
- continue
910
- kind = str(item.get("type") or "")
911
- if not kind and "role" in item:
912
- # canonical conversation message({role, content});当前 input
913
- # 已由 prompt(或 conversation preprocessing)承载,跳过历史项。
914
- continue
915
- if kind in {"text", "input_text"}:
916
- text = str(
917
- prompt
918
- if not text_replaced and isinstance(prompt, str)
919
- else item.get("text") or ""
920
- )
921
- text_replaced = True
922
- if text:
923
- native_items.append(TextInput(text=text))
924
- elif kind in {"image", "input_image"} and (
925
- item.get("url") or item.get("image_url")
926
- ):
927
- native_items.append(
928
- ImageInput(url=str(item.get("url") or item.get("image_url")))
929
- )
930
- elif kind == "localImage" and item.get("path"):
931
- native_items.append(LocalImageInput(path=str(item["path"])))
932
- elif kind == "input_file" and (
933
- item.get("file_data")
934
- or str(item.get("file_url") or "").startswith("data:")
935
- ):
936
- file_path = _materialize_inline_file(
937
- str(item.get("file_data") or item.get("file_url")),
938
- str(item.get("filename") or "attachment"),
939
- )
940
- if file_path is not None:
941
- # App Server's ``mention`` input is presentation metadata:
942
- # current Codex versions do not include it in the model's
943
- # user message. Always add an explicit model-visible
944
- # attachment context as well. Small textual files are
945
- # inlined deterministically; binary/large files expose a
946
- # sandbox-readable path that Codex can inspect with tools.
947
- native_items.append(
948
- TextInput(text=_attachment_context_text(file_path, item))
949
- )
950
- native_items.append(
951
- MentionInput(name=file_path.name, path=str(file_path))
952
- )
953
- elif kind == "mention" and item.get("path"):
954
- native_items.append(
955
- MentionInput(
956
- name=str(item.get("name") or item["path"]),
957
- path=str(item["path"]),
958
- )
959
- )
960
- else:
961
- text = prompt if isinstance(prompt, str) else str(prompt or "")
962
- if text:
963
- native_items.append(TextInput(text=text))
964
- combined = [*skills, *native_items]
965
- if not combined:
966
- return prompt
967
- if len(combined) == 1 and isinstance(combined[0], TextInput) and not skills:
968
- return combined[0].text
969
- return combined
970
-
971
-
972
- def _materialize_inline_file(data_url: str, filename: str) -> Path | None:
973
- """Materialize a bounded Studio inline attachment for native Codex."""
974
-
975
- match = re.fullmatch(r"data:([^;,]+)?;base64,([A-Za-z0-9+/=\s]+)", data_url)
976
- encoded = match.group(2) if match is not None else data_url.strip()
977
- try:
978
- payload = base64.b64decode(encoded, validate=True)
979
- except (ValueError, binascii.Error):
980
- return None
981
- if not payload or len(payload) > 10 * 1024 * 1024:
982
- return None
983
- safe_name = re.sub(r"[^A-Za-z0-9._-]+", "-", Path(filename).name).strip(".-")
984
- safe_name = safe_name[:120] or "attachment"
985
- digest = hashlib.sha256(payload).hexdigest()
986
- path = Path("/tmp/ksadk-codex-attachments") / digest / safe_name
987
- path.parent.mkdir(parents=True, exist_ok=True)
988
- if not path.exists():
989
- path.write_bytes(payload)
990
- return path
991
-
992
-
993
- _MAX_INLINE_ATTACHMENT_TEXT_BYTES = 64 * 1024
994
- _TEXT_ATTACHMENT_SUFFIXES = {
995
- ".csv",
996
- ".html",
997
- ".htm",
998
- ".ini",
999
- ".json",
1000
- ".jsonl",
1001
- ".log",
1002
- ".md",
1003
- ".py",
1004
- ".rst",
1005
- ".toml",
1006
- ".tsv",
1007
- ".txt",
1008
- ".xml",
1009
- ".yaml",
1010
- ".yml",
1011
- }
1012
-
1013
-
1014
- def _attachment_context_text(path: Path, item: Mapping[str, Any]) -> str:
1015
- """Build model-visible context for a materialized Responses input file."""
1016
-
1017
- name = str(item.get("filename") or path.name).replace('"', "'")
1018
- inline_data = item.get("inlineData")
1019
- inline_mime = inline_data.get("mimeType") if isinstance(inline_data, Mapping) else None
1020
- mime_type = str(item.get("mime_type") or inline_mime or "").strip().lower()
1021
- source = str(item.get("file_data") or item.get("file_url") or "")
1022
- data_url_match = re.match(r"data:([^;,]+)", source)
1023
- if not mime_type and data_url_match is not None:
1024
- mime_type = data_url_match.group(1).strip().lower()
1025
- is_text = mime_type.startswith("text/") or path.suffix.lower() in _TEXT_ATTACHMENT_SUFFIXES
1026
- header = f'<uploaded_attachment name="{name}" path="{path}">'
1027
- if not is_text:
1028
- return (
1029
- f"{header}\n"
1030
- "The uploaded file is available at the path above. Read it with an appropriate "
1031
- "tool before answering questions about its contents.\n"
1032
- "</uploaded_attachment>"
1033
- )
1034
-
1035
- raw = path.read_bytes()
1036
- truncated = len(raw) > _MAX_INLINE_ATTACHMENT_TEXT_BYTES
1037
- text = raw[:_MAX_INLINE_ATTACHMENT_TEXT_BYTES].decode("utf-8", errors="replace")
1038
- suffix = "\n[attachment content truncated]" if truncated else ""
1039
- return f"{header}\n{text}{suffix}\n</uploaded_attachment>"
1040
840
 
1041
841
 
1042
842
  __all__ = ["CodexRuntimeAdapter"]
ksadk/common/auth.py CHANGED
@@ -49,6 +49,8 @@ class AWSV4Auth:
49
49
  secret_access_key: str = "",
50
50
  region: str = "cn-beijing-6",
51
51
  service: str = "aicp",
52
+ *,
53
+ allow_env_fallback: bool = True,
52
54
  ):
53
55
  """初始化签名器
54
56
 
@@ -57,17 +59,21 @@ class AWSV4Auth:
57
59
  secret_access_key: 访问密钥 (SK),默认从环境变量读取
58
60
  region: 区域 ID (如 cn-beijing-6)
59
61
  service: 服务名称 (如 kmr, aicp, iam 等)
62
+ allow_env_fallback: 显式运行时连接设为 False,禁止继承宿主凭证
60
63
  """
61
- self.access_key_id = (
62
- access_key_id
63
- or os.environ.get("KSYUN_ACCESS_KEY")
64
- or os.environ.get("KS3_ACCESS_KEY", "")
65
- )
66
- self.secret_access_key = (
67
- secret_access_key
68
- or os.environ.get("KSYUN_SECRET_KEY")
69
- or os.environ.get("KS3_SECRET_KEY", "")
70
- )
64
+ self.access_key_id = access_key_id
65
+ self.secret_access_key = secret_access_key
66
+ if allow_env_fallback:
67
+ self.access_key_id = (
68
+ self.access_key_id
69
+ or os.environ.get("KSYUN_ACCESS_KEY")
70
+ or os.environ.get("KS3_ACCESS_KEY", "")
71
+ )
72
+ self.secret_access_key = (
73
+ self.secret_access_key
74
+ or os.environ.get("KSYUN_SECRET_KEY")
75
+ or os.environ.get("KS3_SECRET_KEY", "")
76
+ )
71
77
  self.region = region
72
78
  self.service = service
73
79
 
@@ -232,6 +232,28 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
232
232
  "Isolate native Codex state under the project workspace; set to 0 for debugging only.",
233
233
  "1",
234
234
  ),
235
+ EnvVarSpec(
236
+ "KSADK_DSH_BIN",
237
+ "plugins",
238
+ (
239
+ "Optional absolute path to the managed DSH command; must match the pinned "
240
+ "toolchain version."
241
+ ),
242
+ ),
243
+ EnvVarSpec(
244
+ "KSADK_DSH_HOME",
245
+ "plugins",
246
+ (
247
+ "Directory containing the isolated DSH Profile; defaults to .agentkit/dsh-home "
248
+ "in the workspace."
249
+ ),
250
+ ),
251
+ EnvVarSpec(
252
+ "KSADK_DSH_PROFILE",
253
+ "plugins",
254
+ "DSH Profile name used by Studio and the plugin bridge.",
255
+ "studio",
256
+ ),
235
257
  EnvVarSpec(
236
258
  "KSADK_STUDIO_NO_SECURITY",
237
259
  "studio",
@@ -347,6 +369,12 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
347
369
  sensitive=True,
348
370
  ),
349
371
  EnvVarSpec("KSADK_KB_TOP_K", "knowledge_base", "Knowledge-base retrieval result count.", "5"),
372
+ EnvVarSpec(
373
+ "KSADK_CHECKPOINT_DSN",
374
+ "sessions",
375
+ "Framework-agnostic PostgreSQL checkpoint DSN.",
376
+ sensitive=True,
377
+ ),
350
378
  EnvVarSpec(
351
379
  "KSADK_LANGGRAPH_CHECKPOINT_DSN",
352
380
  "sessions",
@@ -356,9 +384,17 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
356
384
  EnvVarSpec(
357
385
  "KSADK_LANGGRAPH_AUTO_CHECKPOINT",
358
386
  "sessions",
359
- "Allow a hosted LangGraph runner to rebuild a factory-exported graph with the managed PostgreSQL saver.",
387
+ (
388
+ "Allow a hosted LangGraph runner to rebuild a factory-exported graph with the "
389
+ "managed PostgreSQL saver."
390
+ ),
360
391
  "false",
361
392
  ),
393
+ EnvVarSpec(
394
+ "KSADK_LANGGRAPH_POSTGRES_REQUIREMENTS",
395
+ "builders",
396
+ "Internal bundled LangGraph PostgreSQL checkpointer requirement constant.",
397
+ ),
362
398
  EnvVarSpec(
363
399
  "KSADK_LOCAL_SKILLS_DIR", "skills", "Local directory containing extracted Skill packages."
364
400
  ),
@@ -436,6 +472,18 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
436
472
  "model_proxy",
437
473
  "Comma-separated model allowlist for the experimental model proxy.",
438
474
  ),
475
+ EnvVarSpec(
476
+ "KSADK_PERSISTENCE_PROBE_CACHE_TTL",
477
+ "sessions",
478
+ "PostgreSQL persistence readiness cache TTL seconds.",
479
+ "30",
480
+ ),
481
+ EnvVarSpec(
482
+ "KSADK_PERSISTENCE_PROBE_TIMEOUT",
483
+ "sessions",
484
+ "PostgreSQL persistence readiness timeout seconds.",
485
+ "2",
486
+ ),
439
487
  EnvVarSpec("KSADK_PG_EVENTS_TABLE", "sessions", "Internal PostgreSQL events table constant."),
440
488
  EnvVarSpec(
441
489
  "KSADK_PG_SESSIONS_TABLE", "sessions", "Internal PostgreSQL sessions table constant."
@@ -473,6 +521,11 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
473
521
  "skills",
474
522
  "Comma-separated public Skill Space ids appended after user spaces.",
475
523
  ),
524
+ EnvVarSpec(
525
+ "KSADK_RESOURCE_IAM_ENDPOINT",
526
+ "platform_resources",
527
+ "Operator-owned IAM endpoint used to authorize Studio platform-resource bindings.",
528
+ ),
476
529
  EnvVarSpec(
477
530
  "KSADK_RESPONSES_SESSION_HEADER",
478
531
  "runners",
@@ -640,7 +693,10 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
640
693
  EnvVarSpec(
641
694
  "KSADK_AGENT_KERNEL",
642
695
  "kernel",
643
- "Opt in to Agent Kernel ingress locally; managed deployment may use AGENT_KERNEL_ENABLED instead.",
696
+ (
697
+ "Opt in to Agent Kernel ingress locally; managed deployment may use "
698
+ "AGENT_KERNEL_ENABLED instead."
699
+ ),
644
700
  "false",
645
701
  ),
646
702
  EnvVarSpec("KSADK_SESSION_PATH", "sessions", "Conversation local SQLite database path."),
@@ -810,7 +866,7 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
810
866
  "KSADK_WEB_VERSION",
811
867
  "web",
812
868
  "Published KsADK Web npm version used for a reproducible wheel build.",
813
- "0.3.2",
869
+ "0.3.7",
814
870
  ),
815
871
  EnvVarSpec(
816
872
  "KSADK_WORKING_SET_MAX_FILES",