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
ksadk/kernel/bootstrap.py CHANGED
@@ -39,7 +39,7 @@ from ksadk.kernel.contract_fingerprints import (
39
39
  )
40
40
  from ksadk.kernel.contracts import RuntimeCapabilityMatrix
41
41
  from ksadk.kernel.control import AgentKernel, default_capability_matrix
42
- from ksadk.kernel.errors import InvalidCommandError
42
+ from ksadk.kernel.errors import InvalidCommandError, StaleFenceError
43
43
  from ksadk.kernel.recovery import RecoveryCoordinator
44
44
  from ksadk.kernel.runtime_identity import runtime_identity
45
45
  from ksadk.kernel.store import AgentKernelStore, now_utc
@@ -465,8 +465,25 @@ class AgentKernelRuntime:
465
465
  lease,
466
466
  session_id=session_id,
467
467
  )
468
- if result.outcome != "idle":
468
+ if result.outcome in {"claimed", "completed"}:
469
469
  progressed = True
470
+ elif result.outcome == "terminal_failure":
471
+ if isinstance(result.error, StaleFenceError):
472
+ # 当前 activation 已失去 fence,不能继续触碰该
473
+ # session,也不应把正常 takeover 误判为坏数据。
474
+ self._heartbeat_sessions.discard(session_id)
475
+ self._last_renewed.pop(session_id, None)
476
+ self.lease_heartbeat.forget(session_id)
477
+ continue
478
+ failure = result.error or RuntimeError(
479
+ "agent kernel command failed without an error detail"
480
+ )
481
+ if not await self._quarantine_session(
482
+ session_id,
483
+ failure,
484
+ context="command execution",
485
+ ):
486
+ return
470
487
  self._store_failures = 0
471
488
  except asyncio.CancelledError:
472
489
  raise
@@ -609,7 +626,13 @@ class AgentKernelRuntime:
609
626
  return False
610
627
  return True
611
628
 
612
- async def _quarantine_session(self, session_id: str, exc: Exception) -> bool:
629
+ async def _quarantine_session(
630
+ self,
631
+ session_id: str,
632
+ exc: Exception,
633
+ *,
634
+ context: str = "takeover recovery",
635
+ ) -> bool:
613
636
  """隔离一个恢复失败的 session;返回 False 表示已触发进程级降级。
614
637
 
615
638
  被隔离的 session 不再被本 runtime claim / 恢复 / 续约,其 inbox
@@ -631,9 +654,10 @@ class AgentKernelRuntime:
631
654
  self._last_renewed.pop(session_id, None)
632
655
  self.lease_heartbeat.forget(session_id)
633
656
  logger.warning(
634
- "agent kernel session %s quarantined after takeover recovery "
657
+ "agent kernel session %s quarantined after %s "
635
658
  "failed: agent_instance_id=%s error=%s: %s",
636
659
  session_id,
660
+ context,
637
661
  self.config.agent_instance_id,
638
662
  type(exc).__name__,
639
663
  exc,
@@ -15,7 +15,7 @@ from typing import Any
15
15
 
16
16
  AGENT_KERNEL_V1_CONTRACT_SET = "agent-kernel/v1"
17
17
  AGENT_KERNEL_V1_AGGREGATE_DIGEST = (
18
- "47e1003e03d97abeba232cc3e03a14b9cbcf78b1109870ccd2ce371f073b6211"
18
+ "b610a25aae957306b9f84a2cc2c948b30d1ce6218585cfd2a91f96736b92d102"
19
19
  )
20
20
 
21
21
 
@@ -23,12 +23,13 @@ def runtime_capability_matrix_wire_value(matrix: Any) -> dict[str, Any]:
23
23
  """Serialize the additive matrix without materializing absent v2 modes.
24
24
 
25
25
  Pydantic includes optional ``None`` defaults in ``model_dump``. Omitting
26
- those three top-level keys preserves the exact pre-extension wire value and
27
- capability digest for runtimes that do not publish goal/loop/plan.
26
+ those additive top-level keys preserves the exact pre-extension wire value
27
+ and capability digest for runtimes that do not publish execution controls
28
+ or an interaction delivery mode.
28
29
  """
29
30
 
30
31
  dump = matrix.model_dump(mode="json")
31
- for key in ("goal", "loop", "plan"):
32
+ for key in ("interaction_mode", "goal", "loop", "plan"):
32
33
  if dump.get(key) is None:
33
34
  dump.pop(key, None)
34
35
  return dump
ksadk/kernel/contracts.py CHANGED
@@ -309,6 +309,14 @@ class RuntimeCapabilityMatrix(WireModel):
309
309
  inject: RuntimeCapability
310
310
  checkpoint: RuntimeCapability
311
311
  durable_restore: RuntimeCapability
312
+ # Interaction delivery is deliberately separate from the verb matrix:
313
+ # ``submit_interaction`` alone does not tell a caller whether the reply
314
+ # reaches a live process, resumes a checkpoint, or has no native route.
315
+ # It remains optional so a v1 consumer can read records emitted before
316
+ # this additive declaration without inventing support.
317
+ interaction_mode: Literal[
318
+ "live_submit", "durable_resume", "unavailable"
319
+ ] | None = None
312
320
  # Runtime v2 execution controls are additive optional capabilities. Older
313
321
  # runtimes omit them; a runtime must never infer support from UI presence.
314
322
  # ``loop`` specifically means an externally bounded, eval-driven
ksadk/kernel/control.py CHANGED
@@ -57,6 +57,7 @@ def default_capability_matrix() -> RuntimeCapabilityMatrix:
57
57
  inject=_unavailable("runtime_no_native_inject"),
58
58
  checkpoint=_unavailable(),
59
59
  durable_restore=_unavailable(),
60
+ interaction_mode="unavailable",
60
61
  )
61
62
 
62
63
 
ksadk/kernel/ingress.py CHANGED
@@ -94,9 +94,22 @@ def get_agent_kernel() -> Any | None:
94
94
 
95
95
 
96
96
  def kernel_route_active() -> bool:
97
- """当前请求是否走 kernel ingress(开关开 且 kernel 已注册)。"""
97
+ """Whether public compatibility routes may self-admit through the kernel.
98
+
99
+ A hosted Runtime accepts AgentControl commands only with a permit issued by
100
+ Server. The public ``/v1/responses`` / legacy ``RunAgent`` routes do not
101
+ carry that permit, so routing them through ``trusted_context`` would create
102
+ a process-local signature that the hosted verifier must reject. Keep those
103
+ authenticated compatibility routes on their established executor path;
104
+ Server continues to use the dedicated ``/agent-kernel/v1/*`` ingress, which
105
+ validates the Server-issued permit independently of this selector.
106
+ """
98
107
 
99
- return kernel_ingress_enabled() and get_agent_kernel() is not None
108
+ return (
109
+ kernel_ingress_enabled()
110
+ and get_agent_kernel() is not None
111
+ and authority_mode() != _AUTHORITY_HOSTED
112
+ )
100
113
 
101
114
 
102
115
  # ---------------------------------------------------------------------------
@@ -421,6 +434,26 @@ def map_studio_request(
421
434
  )
422
435
 
423
436
 
437
+ def map_scheduler_request(
438
+ *,
439
+ session_id: str,
440
+ idempotency_key: str,
441
+ content: Any,
442
+ occurrence_id: str,
443
+ trusted: TrustedRuntimeContext,
444
+ ) -> AgentControlCommand:
445
+ """Scheduler occurrence -> enqueue with durable source and correlation IDs."""
446
+
447
+ return _command(
448
+ trusted=trusted,
449
+ command_type="enqueue",
450
+ session_id=session_id,
451
+ idempotency_key=idempotency_key,
452
+ payload={"content": content},
453
+ correlation_id=occurrence_id,
454
+ )
455
+
456
+
424
457
  def map_control_request(
425
458
  *,
426
459
  command_type: str,
@@ -1091,6 +1124,7 @@ __all__ = [
1091
1124
  "map_control_request",
1092
1125
  "map_responses_request",
1093
1126
  "map_run_request",
1127
+ "map_scheduler_request",
1094
1128
  "map_studio_request",
1095
1129
  "receipt_error_payload",
1096
1130
  "receipt_http_status",
@@ -1124,6 +1124,7 @@ class InMemoryAgentKernelStore:
1124
1124
  "fencing_token": int(expected_fence),
1125
1125
  },
1126
1126
  run_id=run.run_id,
1127
+ causation_id=str(run.metadata.get("command_id") or "") or None,
1127
1128
  ),
1128
1129
  activation_row=activation,
1129
1130
  )
@@ -1647,6 +1647,7 @@ class PostgresAgentKernelStore:
1647
1647
  "fencing_token": int(expected_fence),
1648
1648
  },
1649
1649
  run_id=run.run_id,
1650
+ causation_id=str(run.metadata.get("command_id") or "") or None,
1650
1651
  ),
1651
1652
  activation,
1652
1653
  expected_fence,
@@ -1112,6 +1112,33 @@ class SQLiteAgentKernelStore:
1112
1112
  )
1113
1113
  return self._row_to_record(rows[0]) if rows else None
1114
1114
 
1115
+ async def get_terminal_receipt(
1116
+ self, interaction_id: str, *, tenant_id: str, agent_instance_id: str,
1117
+ session_id: str, run_id: str,
1118
+ ) -> InteractionReceipt | None:
1119
+ """Read the committed outcome inside a complete trusted scope.
1120
+
1121
+ Resolved alone does not mean approved. Pending/resolving records never
1122
+ yield an authorization receipt; callers must still match the request.
1123
+ """
1124
+ if not all(isinstance(value, str) and value for value in (
1125
+ interaction_id, tenant_id, agent_instance_id, session_id, run_id
1126
+ )):
1127
+ raise InvalidCommandError("interaction receipt requires a complete trusted scope")
1128
+ row = await self._fetchone(
1129
+ await self._connect(),
1130
+ "SELECT * FROM kernel_interactions WHERE interaction_id=? AND tenant_id=?"
1131
+ " AND agent_instance_id=? AND session_id=? AND run_id=?",
1132
+ (interaction_id, tenant_id, agent_instance_id, session_id, run_id),
1133
+ )
1134
+ if row is None or not is_terminal(row["status"]):
1135
+ return None
1136
+ return InteractionReceipt(
1137
+ interaction_id=row["interaction_id"], revision=int(row["revision"]),
1138
+ status=row["status"], outcome=row["outcome"], event_id=row["event_id"],
1139
+ accepted_seq=row["accepted_seq"],
1140
+ )
1141
+
1115
1142
  async def list_pending_interactions(
1116
1143
  self, tenant_id: str, session_id: str
1117
1144
  ) -> list[InteractionRecord]:
@@ -1400,6 +1427,7 @@ class SQLiteAgentKernelStore:
1400
1427
  "fencing_token": int(expected_fence),
1401
1428
  },
1402
1429
  run_id=run.run_id,
1430
+ causation_id=str(run.metadata.get("command_id") or "") or None,
1403
1431
  ),
1404
1432
  activation,
1405
1433
  expected_fence,
ksadk/kernel/store.py CHANGED
@@ -54,6 +54,9 @@ def command_digest(command: AgentControlCommand) -> str:
54
54
  canonical["source"] = source
55
55
 
56
56
  payload = dict(canonical.get("payload") or {})
57
+ # Admission derives this immutable snapshot from the current session. A
58
+ # retry after a tag update must still resolve to the first accepted command.
59
+ payload.pop("session_context", None)
57
60
  if command.command_type == "submit_interaction":
58
61
  payload.pop("token_ref", None)
59
62
  canonical["payload"] = payload
ksadk/kernel/worker.py CHANGED
@@ -109,6 +109,7 @@ class WorkResult:
109
109
  message_id: str | None = None
110
110
  run_id: str | None = None
111
111
  last_seq: int | None = None
112
+ error: Exception | None = None
112
113
 
113
114
 
114
115
  class AgentKernelWorker:
@@ -294,8 +295,10 @@ class AgentKernelWorker:
294
295
  )
295
296
  await self._store.discard_claim(message_id, expected_fence=fence)
296
297
  return WorkResult(outcome="completed", message_id=message_id)
297
- except StaleFenceError:
298
- return WorkResult(outcome="terminal_failure", message_id=message_id)
298
+ except StaleFenceError as error:
299
+ return WorkResult(
300
+ outcome="terminal_failure", message_id=message_id, error=error
301
+ )
299
302
  except AgentKernelError as error:
300
303
  if error.code == RUNTIME_INTERACTION_UNAVAILABLE:
301
304
  # typed rejection:provider 诚实声明无法原生送达回包,
@@ -316,16 +319,46 @@ class AgentKernelWorker:
316
319
  await self._store.discard_claim(message_id, expected_fence=fence)
317
320
  return WorkResult(outcome="completed", message_id=message_id)
318
321
  if error.retryable:
319
- return WorkResult(outcome="retryable_failure", message_id=message_id)
320
- return WorkResult(outcome="terminal_failure", message_id=message_id)
321
- except Exception:
322
+ return WorkResult(
323
+ outcome="retryable_failure", message_id=message_id, error=error
324
+ )
325
+ logger.error(
326
+ "agent kernel command failed permanently: "
327
+ "agent_instance_id=%s session_id=%s command_id=%s "
328
+ "command_type=%s error=%s: %s",
329
+ command.agent_instance_id,
330
+ command.session_id,
331
+ command.command_id,
332
+ command.command_type,
333
+ type(error).__name__,
334
+ error,
335
+ )
336
+ return WorkResult(
337
+ outcome="terminal_failure", message_id=message_id, error=error
338
+ )
339
+ except Exception as error:
322
340
  # 未知异常绝不 ack 为成功:消息保持 claimed。
323
- return WorkResult(outcome="terminal_failure", message_id=message_id)
341
+ logger.exception(
342
+ "agent kernel command raised an unexpected exception: "
343
+ "agent_instance_id=%s session_id=%s command_id=%s "
344
+ "command_type=%s error=%s: %s",
345
+ command.agent_instance_id,
346
+ command.session_id,
347
+ command.command_id,
348
+ command.command_type,
349
+ type(error).__name__,
350
+ error,
351
+ )
352
+ return WorkResult(
353
+ outcome="terminal_failure", message_id=message_id, error=error
354
+ )
324
355
 
325
356
  try:
326
357
  await self._store.complete_claim(message_id, expected_fence=fence)
327
- except StaleFenceError:
328
- return WorkResult(outcome="terminal_failure", message_id=message_id)
358
+ except StaleFenceError as error:
359
+ return WorkResult(
360
+ outcome="terminal_failure", message_id=message_id, error=error
361
+ )
329
362
  return WorkResult(outcome="completed", message_id=message_id, run_id=run_id)
330
363
 
331
364
  async def _message_id_for(self, command: AgentControlCommand) -> str:
@@ -356,6 +389,17 @@ class AgentKernelWorker:
356
389
  agent_instance_id=command.agent_instance_id,
357
390
  session_id=command.session_id,
358
391
  state=RunState.PENDING,
392
+ # Keep the admitted control identity on the durable run. This is
393
+ # not user-supplied metadata: it is copied from the trusted
394
+ # command that the worker actually claimed. Consumers such as the
395
+ # local Scheduler can therefore reconcile a runtime terminal fact
396
+ # back to one occurrence without matching text or wall-clock time.
397
+ metadata={
398
+ "command_id": str(command.command_id),
399
+ "source_kind": command.source.kind,
400
+ "source_ref": command.source.ref,
401
+ "correlation_id": command.correlation_id,
402
+ },
359
403
  )
360
404
  created = await self._store.save_run_transition(pending, expected_fence=fence)
361
405
  continuation_metadata = await self._session_continuation_metadata(command.session_id)
@@ -396,6 +440,11 @@ class AgentKernelWorker:
396
440
  # durable run_id 优先传给 adapter;adapter 不认时以
397
441
  # runtime_run_id 映射显式记录两个 ID 的对应关系。
398
442
  metadata={
443
+ **(
444
+ {"session_context": command.payload["session_context"]}
445
+ if "session_context" in command.payload
446
+ else {}
447
+ ),
399
448
  "command_id": str(command.command_id),
400
449
  "run_id": run_id,
401
450
  **continuation_metadata,
@@ -735,7 +784,17 @@ class AgentKernelWorker:
735
784
  )
736
785
  else:
737
786
  request_schema = dict(event.request.schema_)
738
- native_target = {"call_id": event.interaction_id}
787
+ # Codex maps the native JSON-RPC request id to a stable canonical
788
+ # interaction id for replay. The live client, however, indexes its
789
+ # pending callback by the original request id. Preserve that id as
790
+ # the provider target or SubmitInteraction can find the durable
791
+ # record but cannot wake the blocked Codex callback.
792
+ native_call_id = (
793
+ event.source.native_event_id
794
+ or event.source.native_item_id
795
+ or event.interaction_id
796
+ )
797
+ native_target = {"call_id": native_call_id}
739
798
  for key in ("checkpoint_id", "thread_id"):
740
799
  value = execution.handle.native_ref.get(key)
741
800
  if value is not None:
@@ -801,7 +860,13 @@ class AgentKernelWorker:
801
860
  kind=RESUME_TARGET_KINDS[target_dict["kind"]],
802
861
  id=str(target_dict["id"]),
803
862
  )
804
- resumed = await adapter.resume(handle, target, AdapterResumePayload(kind="free_text"))
863
+ resumed = await adapter.resume(
864
+ handle,
865
+ target,
866
+ AdapterResumePayload(
867
+ kind="free_text", session_context=command.payload.get("session_context")
868
+ ),
869
+ )
805
870
  execution = self._replace_handle(execution, resumed)
806
871
  self._start_stream(
807
872
  execution,
@@ -899,6 +964,7 @@ class AgentKernelWorker:
899
964
  context = InteractionResolveContext(
900
965
  adapter=execution.adapter,
901
966
  handle=execution.handle,
967
+ session_context=command.payload.get("session_context"),
902
968
  activation_id=activation.activation_id,
903
969
  fencing_token=fence,
904
970
  )
@@ -86,6 +86,8 @@ class KnowledgeBaseClient(BaseModel):
86
86
  # KnowledgeBaseService.build_context 区分"后端吞错返空"与"真无结果",
87
87
  # 避免错误伪装成"未找到"注入模型上下文。
88
88
  last_error: str = ""
89
+ last_request_id: str = ""
90
+ last_http_status: int | None = None
89
91
 
90
92
  _aicp_client: Any = None
91
93
 
@@ -140,9 +142,7 @@ class KnowledgeBaseClient(BaseModel):
140
142
  "Ensure kingsoftcloud-sdk-python is installed and up to date."
141
143
  )
142
144
 
143
- cred = credential.Credential(
144
- self.access_key, self.secret_key, self.session_token or None
145
- )
145
+ cred = credential.Credential(self.access_key, self.secret_key, self.session_token or None)
146
146
 
147
147
  http_profile = HttpProfile()
148
148
  http_profile.endpoint = self.endpoint
@@ -153,17 +153,23 @@ class KnowledgeBaseClient(BaseModel):
153
153
  client_profile = ClientProfile()
154
154
  client_profile.httpProfile = http_profile
155
155
 
156
- self._aicp_client = aicp_module.AicpClient(cred, self.region, profile=client_profile)
156
+ owner = self
157
+
158
+ class ObservedAicpClient(aicp_module.AicpClient):
159
+ def _check_status(self, response):
160
+ # The upstream SDK discards HTTP status when raising its generic
161
+ # ServerNetworkError. Capture only the status before delegation;
162
+ # never infer authorization from exception text/response content.
163
+ owner.last_http_status = response.status
164
+ return super()._check_status(response)
165
+
166
+ self._aicp_client = ObservedAicpClient(cred, self.region, profile=client_profile)
157
167
 
158
168
  # 强制覆写 API 版本为 RetrieveKnowledge 所需的 2025-11-14
159
169
  # SDK 的 _apiVersion 由导入的模块版本决定,可能不匹配
160
170
  self._aicp_client._apiVersion = "2025-11-14"
161
171
 
162
- logger.info(
163
- f"KnowledgeBaseClient initialized: "
164
- f"dataset_id={self.dataset_id}, region={self.region}, "
165
- f"endpoint={self.endpoint}"
166
- )
172
+ logger.debug("KnowledgeBaseClient initialized")
167
173
  return self._aicp_client
168
174
 
169
175
  def _build_params(self, query: str, top_k: Optional[int] = None) -> dict:
@@ -192,11 +198,41 @@ class KnowledgeBaseClient(BaseModel):
192
198
  try:
193
199
  data = json.loads(response) if isinstance(response, str) else response
194
200
  except (json.JSONDecodeError, TypeError):
195
- self.last_error = f"Failed to parse response: {str(response)[:200]}"
196
- logger.error(f"Failed to parse response: {str(response)[:200]}")
201
+ self.last_error = "Invalid knowledge response JSON"
202
+ logger.error("Invalid knowledge response JSON")
203
+ return []
204
+
205
+ if not isinstance(data, dict):
206
+ self.last_error = "Knowledge response must be an object"
207
+ return []
208
+ metadata = data.get("ResponseMetadata") or {}
209
+ if not isinstance(metadata, dict):
210
+ self.last_error = "Invalid knowledge response metadata"
211
+ return []
212
+ request_id = data.get("RequestId") or metadata.get("RequestId")
213
+ self.last_request_id = (
214
+ request_id if isinstance(request_id, str) and len(request_id) <= 256 else ""
215
+ )
216
+ code = data.get("Code")
217
+ if "Code" in data:
218
+ valid_code = (
219
+ (type(code) is int and code in {0, 200})
220
+ or (type(code) is str and code in {"0", "200"})
221
+ )
222
+ if not valid_code:
223
+ self.last_error = "Knowledge service rejected the request"
224
+ return []
225
+ if data.get("Error") or metadata.get("Error"):
226
+ self.last_error = "Knowledge service rejected the request"
197
227
  return []
198
228
 
199
- records = data.get("Records", [])
229
+ if "Records" not in data:
230
+ self.last_error = "Knowledge response omitted records"
231
+ return []
232
+ records = data["Records"]
233
+ if not isinstance(records, list):
234
+ self.last_error = "Invalid knowledge records"
235
+ return []
200
236
  results = []
201
237
 
202
238
  for record in records:
@@ -228,24 +264,19 @@ class KnowledgeBaseClient(BaseModel):
228
264
  Returns:
229
265
  匹配的文档片段列表
230
266
  """
231
- client = self._get_client()
232
- params = self._build_params(query, top_k)
233
-
234
- logger.info(
235
- f"Searching knowledge base: dataset_id={self.dataset_id}, " f"query='{query[:50]}'"
236
- )
237
-
238
267
  self.last_error = ""
268
+ self.last_request_id = ""
269
+ self.last_http_status = None
239
270
  try:
271
+ client = self._get_client()
272
+ params = self._build_params(query, top_k)
240
273
  response = client.call("RetrieveKnowledge", params, options={"IsPostJson": True})
241
274
  results = self._parse_response(response)
242
- logger.info(
243
- f"Knowledge base returned {len(results)} results " f"for query='{query[:50]}'"
244
- )
275
+ logger.debug("Knowledge base returned %d results", len(results))
245
276
  return results
246
277
  except Exception as e:
247
278
  self.last_error = str(e)
248
- logger.error(f"Knowledge base search failed: {e}")
279
+ logger.error("Knowledge base search failed (%s)", type(e).__name__)
249
280
  raise
250
281
 
251
282
  @classmethod
@@ -261,7 +292,7 @@ class KnowledgeBaseClient(BaseModel):
261
292
  dataset_id = os.environ.get("KSADK_KB_DATASET_ID", "")
262
293
  if not dataset_id:
263
294
  raise ValueError(
264
- "KSADK_KB_DATASET_ID environment variable is required " "to enable knowledge base."
295
+ "KSADK_KB_DATASET_ID environment variable is required to enable knowledge base."
265
296
  )
266
297
 
267
298
  access_key = (
@@ -275,9 +306,8 @@ class KnowledgeBaseClient(BaseModel):
275
306
  or os.environ.get("KSYUN_SECRET_KEY")
276
307
  or os.environ.get("KSYUN_SECRET_ACCESS_KEY", "")
277
308
  )
278
- session_token = (
279
- os.environ.get("KSADK_KB_SESSION_TOKEN")
280
- or os.environ.get("KSYUN_SESSION_TOKEN", "")
309
+ session_token = os.environ.get("KSADK_KB_SESSION_TOKEN") or os.environ.get(
310
+ "KSYUN_SESSION_TOKEN", ""
281
311
  )
282
312
 
283
313
  score_threshold_str = os.environ.get("KSADK_KB_SCORE_THRESHOLD", "")
@@ -3,11 +3,12 @@ from __future__ import annotations
3
3
  import inspect
4
4
  import json
5
5
  import os
6
- from dataclasses import dataclass
6
+ from dataclasses import dataclass, field
7
7
  from typing import Any, Coroutine, Sequence, cast
8
8
  from urllib.parse import urlparse
9
9
 
10
10
  import httpx
11
+ from pydantic import Field
11
12
 
12
13
  from ksadk.compat.adk_compat import (
13
14
  CheckableMcpHttpClientFactory,
@@ -21,8 +22,8 @@ MCP_TOOLSET_KEY_ATTR = "_ksadk_mcp_toolset_key"
21
22
  @dataclass(frozen=True)
22
23
  class MCPServerConfig:
23
24
  name: str
24
- url: str
25
- api_key: str | None = None
25
+ url: str = field(repr=False)
26
+ api_key: str | None = field(default=None, repr=False)
26
27
  tool_filter: tuple[str, ...] = ()
27
28
  tool_name_prefix: str | None = None
28
29
 
@@ -68,7 +69,14 @@ def build_connection_params(
68
69
  kwargs["httpx_client_factory"] = httpx_client_factory or _default_httpx_client_factory(
69
70
  config.url
70
71
  )
71
- return StreamableHTTPConnectionParams(**kwargs)
72
+ return _RedactedStreamableHTTPConnectionParams(**kwargs)
73
+
74
+
75
+ class _RedactedStreamableHTTPConnectionParams(StreamableHTTPConnectionParams):
76
+ """Keep process-scoped MCP connection material out of debug reprs."""
77
+
78
+ url: str = Field(repr=False)
79
+ headers: dict[str, Any] | None = Field(default=None, repr=False)
72
80
 
73
81
 
74
82
  def build_mcp_toolset(