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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (494) hide show
  1. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
  2. agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
  3. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +2 -0
  5. ksadk/a2a/_space_client_events.py +381 -0
  6. ksadk/a2a/bootstrap.py +0 -2
  7. ksadk/a2a/card.py +6 -111
  8. ksadk/a2a/control_plane.py +239 -1
  9. ksadk/a2a/event_adapter.py +156 -64
  10. ksadk/a2a/executor.py +195 -172
  11. ksadk/a2a/routes.py +12 -5
  12. ksadk/a2a/server.py +1 -8
  13. ksadk/a2a/service_env.py +33 -0
  14. ksadk/a2a/space_client.py +43 -349
  15. ksadk/a2a_card.py +101 -0
  16. ksadk/a2ui/core.py +222 -53
  17. ksadk/agui/_agent_helpers.py +243 -0
  18. ksadk/agui/a2ui_projection.py +12 -5
  19. ksadk/agui/agent.py +474 -275
  20. ksadk/agui/config.py +11 -5
  21. ksadk/agui/routes.py +7 -15
  22. ksadk/api/client.py +530 -40
  23. ksadk/api/environment.py +27 -0
  24. ksadk/builders/code_builder.py +352 -53
  25. ksadk/builders/container_builder.py +71 -44
  26. ksadk/builders/framework_requirements.py +2 -1
  27. ksadk/builders/ks3_uploader.py +2 -2
  28. ksadk/builders/managed_runtime_builder.py +60 -28
  29. ksadk/cli/__init__.py +25 -0
  30. ksadk/cli/cmd_a2a.py +18 -31
  31. ksadk/cli/cmd_create.py +13 -26
  32. ksadk/cli/cmd_dashboard.py +15 -1
  33. ksadk/cli/cmd_deploy.py +28 -3
  34. ksadk/cli/cmd_eval.py +443 -0
  35. ksadk/cli/cmd_evalset.py +284 -0
  36. ksadk/cli/cmd_files.py +5 -1
  37. ksadk/cli/cmd_hermes.py +137 -163
  38. ksadk/cli/cmd_invoke.py +28 -38
  39. ksadk/cli/cmd_launch.py +12 -0
  40. ksadk/cli/cmd_managed_runtime.py +95 -0
  41. ksadk/cli/cmd_observe.py +85 -0
  42. ksadk/cli/cmd_openclaw.py +85 -479
  43. ksadk/cli/cmd_replay.py +28 -4
  44. ksadk/cli/cmd_run.py +29 -67
  45. ksadk/cli/cmd_studio.py +201 -0
  46. ksadk/cli/cmd_web.py +15 -6
  47. ksadk/cli/dry_run.py +2 -1
  48. ksadk/cli/env_options.py +83 -0
  49. ksadk/cli/global_options.py +3 -1
  50. ksadk/cli/hermes_env.py +151 -0
  51. ksadk/cli/invoke_payload.py +49 -0
  52. ksadk/cli/network_options.py +7 -5
  53. ksadk/cli/openclaw_env.py +458 -0
  54. ksadk/cli/runtime_bootstrap.py +51 -0
  55. ksadk/cli/ui.py +6 -0
  56. ksadk/cli/workflow_common.py +5 -5
  57. ksadk/codex/__init__.py +3 -3
  58. ksadk/codex/client.py +833 -49
  59. ksadk/codex/phase.py +1 -1
  60. ksadk/codex/runtime.py +720 -127
  61. ksadk/common/kop_client.py +232 -0
  62. ksadk/configs/__init__.py +1 -3
  63. ksadk/configs/env_registry.py +244 -45
  64. ksadk/configs/env_registry_pcm.py +181 -0
  65. ksadk/configs/env_var_spec.py +18 -0
  66. ksadk/configs/global_config.py +6 -1
  67. ksadk/configs/settings.py +5 -108
  68. ksadk/context_engine/__init__.py +98 -0
  69. ksadk/context_engine/assembler.py +176 -0
  70. ksadk/context_engine/baseline.py +419 -0
  71. ksadk/context_engine/cache_observability.py +228 -0
  72. ksadk/context_engine/capabilities.py +443 -0
  73. ksadk/context_engine/contributors.py +344 -0
  74. ksadk/context_engine/hosted_pipeline.py +417 -0
  75. ksadk/context_engine/models.py +117 -0
  76. ksadk/context_engine/planner.py +698 -0
  77. ksadk/context_engine/policies.py +319 -0
  78. ksadk/context_engine/projection.py +31 -0
  79. ksadk/context_engine/shadow_plan.py +266 -0
  80. ksadk/context_engine/tokenizer.py +164 -0
  81. ksadk/conversations/__init__.py +85 -94
  82. ksadk/conversations/context.py +126 -6
  83. ksadk/conversations/message_projection.py +292 -28
  84. ksadk/conversations/model_context.py +49 -3
  85. ksadk/conversations/runtime_compaction.py +207 -5
  86. ksadk/conversations/runtime_input.py +193 -3
  87. ksadk/conversations/runtime_invocation.py +81 -3
  88. ksadk/conversations/runtime_observability.py +157 -4
  89. ksadk/conversations/runtime_payloads.py +42 -0
  90. ksadk/conversations/runtime_preparation.py +280 -2
  91. ksadk/conversations/runtime_resume.py +71 -32
  92. ksadk/conversations/runtime_stream_events.py +94 -9
  93. ksadk/conversations/runtime_streaming.py +175 -22
  94. ksadk/conversations/semantic_summary.py +311 -1
  95. ksadk/conversations/session_lock.py +51 -0
  96. ksadk/deployment/env_forward.py +72 -0
  97. ksadk/deployment/managed_runtime.py +38 -0
  98. ksadk/deployment/manager.py +24 -8
  99. ksadk/deployment/providers/serverless.py +228 -92
  100. ksadk/evaluation/__init__.py +116 -0
  101. ksadk/evaluation/a2a_adapter.py +452 -0
  102. ksadk/evaluation/adapters.py +67 -0
  103. ksadk/evaluation/agent_eval_client.py +395 -0
  104. ksadk/evaluation/cloud_binding.py +80 -0
  105. ksadk/evaluation/cloud_converter.py +194 -0
  106. ksadk/evaluation/cloud_service.py +199 -0
  107. ksadk/evaluation/contracts.py +478 -0
  108. ksadk/evaluation/evalset.py +351 -0
  109. ksadk/evaluation/evaluators.py +627 -0
  110. ksadk/evaluation/evidence.py +258 -0
  111. ksadk/evaluation/executor.py +143 -0
  112. ksadk/evaluation/local_adapter.py +550 -0
  113. ksadk/evaluation/service_env.py +27 -0
  114. ksadk/evaluation/storage.py +68 -0
  115. ksadk/evaluation/studio_build_adapter.py +253 -0
  116. ksadk/evaluation/target.py +82 -0
  117. ksadk/events/__init__.py +13 -13
  118. ksadk/events/_v1_compat/__init__.py +1 -0
  119. ksadk/events/_v1_compat/models.py +299 -0
  120. ksadk/events/_v1_compat/parser.py +247 -0
  121. ksadk/events/_v1_compat/projection.py +753 -0
  122. ksadk/events/adapters/__init__.py +34 -0
  123. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  124. ksadk/events/adapters/_a2a_support.py +275 -0
  125. ksadk/events/adapters/_codex_interactions.py +375 -0
  126. ksadk/events/adapters/_codex_items.py +801 -0
  127. ksadk/events/adapters/_codex_validators.py +311 -0
  128. ksadk/events/adapters/_langgraph_support.py +785 -0
  129. ksadk/events/adapters/a2a.py +841 -0
  130. ksadk/events/adapters/adk.py +503 -0
  131. ksadk/events/adapters/codex.py +717 -0
  132. ksadk/events/adapters/langgraph.py +745 -0
  133. ksadk/events/canonical.py +440 -0
  134. ksadk/events/canonical_replay.py +497 -0
  135. ksadk/events/canonical_store.py +468 -0
  136. ksadk/events/cold_recovery.py +257 -0
  137. ksadk/events/content.py +89 -0
  138. ksadk/events/identity.py +86 -0
  139. ksadk/events/pipeline.py +455 -0
  140. ksadk/events/projections.py +66 -0
  141. ksadk/events/reducer.py +661 -0
  142. ksadk/events/replay.py +3 -36
  143. ksadk/events/runtime_event.py +20 -256
  144. ksadk/events/session_event.py +324 -0
  145. ksadk/events/store.py +3 -316
  146. ksadk/events/v1_compat.py +41 -0
  147. ksadk/harness/__init__.py +3 -2
  148. ksadk/harness/app.py +114 -123
  149. ksadk/harness/config.py +1 -1
  150. ksadk/harness/runtime.py +467 -0
  151. ksadk/hermes_terminal.py +5 -0
  152. ksadk/identity/resolver.py +4 -3
  153. ksadk/interaction/__init__.py +28 -0
  154. ksadk/interaction/contracts.py +136 -0
  155. ksadk/interaction/ledger.py +189 -0
  156. ksadk/interaction/provider.py +122 -0
  157. ksadk/interaction/providers/__init__.py +52 -0
  158. ksadk/interaction/providers/adk.py +40 -0
  159. ksadk/interaction/providers/codex.py +94 -0
  160. ksadk/interaction/providers/langgraph.py +58 -0
  161. ksadk/kernel/__init__.py +117 -0
  162. ksadk/kernel/authorization.py +258 -0
  163. ksadk/kernel/bootstrap.py +1074 -0
  164. ksadk/kernel/contract_fingerprints.py +61 -0
  165. ksadk/kernel/contracts.py +362 -0
  166. ksadk/kernel/control.py +219 -0
  167. ksadk/kernel/errors.py +79 -0
  168. ksadk/kernel/ingress.py +1102 -0
  169. ksadk/kernel/mapping.py +111 -0
  170. ksadk/kernel/memory_store.py +1133 -0
  171. ksadk/kernel/postgres_store.py +1756 -0
  172. ksadk/kernel/recovery.py +452 -0
  173. ksadk/kernel/runtime_identity.py +103 -0
  174. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  175. ksadk/kernel/sqlite_store.py +1410 -0
  176. ksadk/kernel/state.py +145 -0
  177. ksadk/kernel/store.py +232 -0
  178. ksadk/kernel/worker.py +953 -0
  179. ksadk/knowledge_base/client.py +22 -4
  180. ksadk/knowledge_base/service.py +32 -5
  181. ksadk/managed_a2a_card.py +160 -0
  182. ksadk/managed_runtime.py +16 -9
  183. ksadk/memory/__init__.py +61 -0
  184. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  185. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  186. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  187. ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
  188. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  189. ksadk/memory/adk/long_term_memory.py +3 -2
  190. ksadk/memory/coordinator.py +461 -0
  191. ksadk/memory/events.py +202 -0
  192. ksadk/memory/extraction.py +228 -0
  193. ksadk/memory/ltm_backend_factory.py +16 -3
  194. ksadk/memory/models.py +316 -0
  195. ksadk/memory/policy.py +215 -0
  196. ksadk/memory/provider.py +47 -0
  197. ksadk/memory/provider_adapter.py +159 -0
  198. ksadk/memory/provider_resolver.py +71 -0
  199. ksadk/memory/providers/__init__.py +5 -0
  200. ksadk/memory/providers/local_sqlite.py +490 -0
  201. ksadk/memory/resolved_policy.py +145 -0
  202. ksadk/memory/service.py +198 -8
  203. ksadk/memory/tool.py +4 -0
  204. ksadk/model_proxy/bootstrap.py +16 -9
  205. ksadk/model_proxy/config.py +22 -1
  206. ksadk/model_proxy/detect.py +202 -9
  207. ksadk/model_proxy/namespace.py +67 -15
  208. ksadk/model_proxy/server.py +168 -6
  209. ksadk/model_proxy/transform.py +105 -3
  210. ksadk/observability/__init__.py +25 -0
  211. ksadk/observability/session_log.py +420 -0
  212. ksadk/observability/trajectory.py +105 -0
  213. ksadk/prompts/__init__.py +71 -0
  214. ksadk/prompts/compiler.py +215 -0
  215. ksadk/prompts/models.py +82 -0
  216. ksadk/prompts/projection.py +89 -0
  217. ksadk/prompts/resolved.py +137 -0
  218. ksadk/prompts/sources.py +233 -0
  219. ksadk/runners/_langgraph_runner_streams.py +822 -0
  220. ksadk/runners/adk_runner.py +14 -31
  221. ksadk/runners/base_runner.py +44 -3
  222. ksadk/runners/factory.py +3 -3
  223. ksadk/runners/langgraph_runner.py +252 -433
  224. ksadk/runners/utils/__init__.py +0 -10
  225. ksadk/runners/utils/loader.py +16 -0
  226. ksadk/runtime/__init__.py +67 -41
  227. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  228. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  229. ksadk/runtime/adapter.py +199 -16
  230. ksadk/runtime/conversation_execution.py +687 -0
  231. ksadk/runtime/executor.py +392 -0
  232. ksadk/runtime/factory.py +342 -0
  233. ksadk/runtime/framework_adapters.py +6 -12
  234. ksadk/runtime/hosted_finalizer.py +268 -0
  235. ksadk/runtime/launch.py +61 -0
  236. ksadk/runtime/preprocessing.py +49 -14
  237. ksadk/runtime/runner_adapter.py +330 -391
  238. ksadk/runtime/runner_loading.py +36 -0
  239. ksadk/runtime/usage.py +33 -0
  240. ksadk/sandbox/backends/e2b.py +36 -3
  241. ksadk/server/__init__.py +39 -4
  242. ksadk/server/app.py +18 -492
  243. ksadk/server/composition.py +36 -2
  244. ksadk/server/factory.py +210 -149
  245. ksadk/server/routes/common.py +15 -46
  246. ksadk/server/routes/control.py +13 -9
  247. ksadk/server/routes/kernel_ingress.py +258 -0
  248. ksadk/server/routes/misc.py +10 -33
  249. ksadk/server/routes/models.py +14 -6
  250. ksadk/server/routes/openai_compat.py +129 -27
  251. ksadk/server/routes/projection.py +84 -16
  252. ksadk/server/routes/run.py +347 -460
  253. ksadk/server/routes/sessions.py +37 -40
  254. ksadk/server/routes/streaming.py +52 -7
  255. ksadk/server/routes/workspace.py +54 -21
  256. ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  257. ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
  258. ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  259. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  260. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  261. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  262. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  263. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  264. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  265. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  266. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  267. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  268. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  269. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  270. ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  271. ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  272. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  273. ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  274. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  275. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  276. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  277. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  278. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  279. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  280. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  281. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  282. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  283. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  284. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  285. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  286. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  287. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  288. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  289. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  290. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  291. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  292. ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
  293. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  294. ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
  295. ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
  296. ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
  297. ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
  298. ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
  299. ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
  300. ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
  301. ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
  302. ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
  303. ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
  304. ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
  305. ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
  306. ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
  307. ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
  308. ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
  309. ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
  310. ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
  311. ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
  312. ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
  313. ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
  314. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  315. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  316. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  317. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  318. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  319. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  320. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  321. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  322. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  323. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  324. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  325. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  326. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  327. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  328. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  329. ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
  330. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  331. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  332. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  333. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  334. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  335. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  336. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  337. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  338. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  339. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  340. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  341. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  342. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  343. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  344. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  345. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  346. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  347. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  348. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  349. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  350. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  351. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  352. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  353. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  354. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  355. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  356. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  357. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  358. ksadk/server/static/index.html +2 -2
  359. ksadk/sessions/__init__.py +26 -9
  360. ksadk/sessions/_local_service_sync.py +688 -0
  361. ksadk/sessions/_local_tables.py +21 -0
  362. ksadk/sessions/_postgres_schema.py +305 -0
  363. ksadk/sessions/_postgres_tables.py +15 -0
  364. ksadk/sessions/base.py +80 -1
  365. ksadk/sessions/in_memory.py +53 -2
  366. ksadk/sessions/local_service.py +63 -604
  367. ksadk/sessions/postgres_service.py +58 -148
  368. ksadk/sessions/resilient.py +35 -1
  369. ksadk/skills/runtime/backends/e2b.py +1 -1
  370. ksadk/skills/service_client.py +13 -3
  371. ksadk/studio/__init__.py +5 -0
  372. ksadk/studio/agent_avatar_assets.py +120 -0
  373. ksadk/studio/agent_lifecycle.py +51 -0
  374. ksadk/studio/api.py +1598 -0
  375. ksadk/studio/api_catalog_routes.py +324 -0
  376. ksadk/studio/api_contracts.py +286 -0
  377. ksadk/studio/api_helpers.py +132 -0
  378. ksadk/studio/api_memory_routes.py +82 -0
  379. ksadk/studio/authoring.py +749 -0
  380. ksadk/studio/authoring_coordinator.py +1017 -0
  381. ksadk/studio/builder.py +397 -0
  382. ksadk/studio/capabilities.py +368 -0
  383. ksadk/studio/cloud.py +2099 -0
  384. ksadk/studio/codex_agent_service.py +694 -0
  385. ksadk/studio/codex_authoring.py +469 -0
  386. ksadk/studio/codex_builder.py +437 -0
  387. ksadk/studio/codex_manifest.py +307 -0
  388. ksadk/studio/codex_run.py +395 -0
  389. ksadk/studio/compiler.py +190 -0
  390. ksadk/studio/contracts.py +755 -0
  391. ksadk/studio/errors.py +47 -0
  392. ksadk/studio/event_store.py +214 -0
  393. ksadk/studio/framework_run.py +342 -0
  394. ksadk/studio/hosted_kernel.py +317 -0
  395. ksadk/studio/identifiers.py +33 -0
  396. ksadk/studio/manifest_resolver.py +131 -0
  397. ksadk/studio/mcp_runtime.py +229 -0
  398. ksadk/studio/model_client.py +629 -0
  399. ksadk/studio/model_profile_service.py +214 -0
  400. ksadk/studio/operations.py +275 -0
  401. ksadk/studio/otel_trace.py +1060 -0
  402. ksadk/studio/pagination.py +182 -0
  403. ksadk/studio/pcm_memory.py +85 -0
  404. ksadk/studio/python_tool_inspection.py +183 -0
  405. ksadk/studio/repository.py +327 -0
  406. ksadk/studio/resource_catalog.py +1260 -0
  407. ksadk/studio/run_service.py +1133 -0
  408. ksadk/studio/runtime_catalog.py +74 -0
  409. ksadk/studio/runtime_source.py +365 -0
  410. ksadk/studio/service.py +2249 -0
  411. ksadk/studio/shared_web.py +1004 -0
  412. ksadk/studio/skill_discovery.py +628 -0
  413. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  414. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  415. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  416. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  417. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  418. ksadk/studio/static/index.html +15 -0
  419. ksadk/studio/templates.py +722 -0
  420. ksadk/studio/validator.py +265 -0
  421. ksadk/studio/workspace.py +135 -0
  422. ksadk/tools/gateway.py +9 -0
  423. ksadk/toolsets/__init__.py +27 -1
  424. ksadk/toolsets/a2a.py +426 -0
  425. ksadk/tracing/__init__.py +19 -21
  426. ksadk/tracing/setup.py +317 -403
  427. ksadk/tracing/span_utils.py +0 -44
  428. ksadk/version.py +1 -1
  429. ksadk_runtime_common/memory_backend/registry.py +56 -56
  430. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  431. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  432. ksadk_runtime_common/workspace_files/router.py +8 -2
  433. agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
  434. ksadk/a2a/card_builder.py +0 -64
  435. ksadk/a2a/client.py +0 -309
  436. ksadk/events/parser.py +0 -191
  437. ksadk/harness/runner.py +0 -211
  438. ksadk/runners/codex_runner.py +0 -132
  439. ksadk/runners/utils/langfuse.py +0 -230
  440. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  441. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
  442. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
  443. ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
  444. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
  445. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
  446. ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
  447. ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
  448. ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
  449. ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
  450. ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
  451. ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
  452. ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
  453. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
  454. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
  455. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
  456. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  457. ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
  458. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  459. ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
  460. ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
  461. ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
  462. ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
  463. ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
  464. ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
  465. ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
  466. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
  467. ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
  468. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
  469. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
  470. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
  471. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  472. ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
  473. ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
  474. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
  475. ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
  476. ksadk/server/static/assets/katex-DATssjp1.js +0 -265
  477. ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
  478. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
  479. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
  480. ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
  481. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
  482. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
  483. ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
  484. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
  485. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
  486. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
  487. ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
  488. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
  489. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
  490. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
  491. ksadk/tracing/exporters/langfuse_exporter.py +0 -460
  492. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  493. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  494. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
@@ -10,7 +10,14 @@ from typing import Any, Optional
10
10
  from urllib.parse import urlsplit, urlunsplit
11
11
 
12
12
  from ksadk.ids import new_session_id
13
+ from ksadk.sessions._postgres_schema import _PostgresSchemaMixin
14
+ from ksadk.sessions._postgres_tables import (
15
+ KSADK_PG_EVENTS_TABLE,
16
+ KSADK_PG_SESSIONS_TABLE,
17
+ KSADK_PG_STATES_TABLE,
18
+ )
13
19
  from ksadk.sessions.base import (
20
+ CANONICAL_EVENT_STORAGE_CAPABILITIES,
14
21
  BaseSessionService,
15
22
  Session,
16
23
  SessionEvent,
@@ -19,15 +26,12 @@ from ksadk.sessions.base import (
19
26
  )
20
27
  from ksadk.sessions.errors import SessionBackendUnavailable
21
28
 
22
- KSADK_PG_SESSIONS_TABLE = "ksadk_sessions"
23
- KSADK_PG_EVENTS_TABLE = "ksadk_events"
24
- KSADK_PG_STATES_TABLE = "ksadk_states"
25
- PG_READABLE_EVENTS_VIEW = "ksadk_session_events_readable"
26
-
27
29
  logger = logging.getLogger(__name__)
28
30
 
29
31
 
30
- class PostgresSessionService(BaseSessionService):
32
+ class PostgresSessionService(_PostgresSchemaMixin, BaseSessionService):
33
+ storage_capabilities = CANONICAL_EVENT_STORAGE_CAPABILITIES
34
+
31
35
  def __init__(
32
36
  self,
33
37
  *,
@@ -304,7 +308,9 @@ class PostgresSessionService(BaseSessionService):
304
308
  seq_id=int(next_seq or 1),
305
309
  invocation_id=event.invocation_id,
306
310
  metadata=dict(event.metadata),
311
+ seq_binding=event.seq_binding,
307
312
  )
313
+ stored.bind_seq_id(int(next_seq or 1))
308
314
  await connection.execute(
309
315
  f"""
310
316
  INSERT INTO {KSADK_PG_EVENTS_TABLE} (
@@ -349,6 +355,52 @@ class PostgresSessionService(BaseSessionService):
349
355
  )
350
356
  return stored
351
357
 
358
+ async def get_event_by_id(self, session_id: str, event_id: str) -> Optional[SessionEvent]:
359
+ await self._ensure_schema()
360
+ async with self._pool.acquire() as connection:
361
+ row = await connection.fetchrow(
362
+ f"""
363
+ SELECT id, session_id, author, event_type, content_json, timestamp,
364
+ state_delta_json, seq_id, invocation_id, metadata_json
365
+ FROM {KSADK_PG_EVENTS_TABLE}
366
+ WHERE namespace = $1 AND session_id = $2 AND id = $3
367
+ """,
368
+ self.namespace,
369
+ session_id,
370
+ event_id,
371
+ )
372
+ return self._event_from_row(row) if row is not None else None
373
+
374
+ async def get_events_by_invocation_id(
375
+ self,
376
+ session_id: str,
377
+ invocation_id: str,
378
+ *,
379
+ after_seq_id: Optional[int] = None,
380
+ before_seq_id: Optional[int] = None,
381
+ ) -> list[SessionEvent]:
382
+ await self._ensure_schema()
383
+ conditions = ["namespace = $1", "session_id = $2", "invocation_id = $3"]
384
+ params: list[Any] = [self.namespace, session_id, invocation_id]
385
+ if after_seq_id is not None:
386
+ params.append(after_seq_id)
387
+ conditions.append(f"seq_id > ${len(params)}")
388
+ if before_seq_id is not None:
389
+ params.append(before_seq_id)
390
+ conditions.append(f"seq_id < ${len(params)}")
391
+ async with self._pool.acquire() as connection:
392
+ rows = await connection.fetch(
393
+ f"""
394
+ SELECT id, session_id, author, event_type, content_json, timestamp,
395
+ state_delta_json, seq_id, invocation_id, metadata_json
396
+ FROM {KSADK_PG_EVENTS_TABLE}
397
+ WHERE {" AND ".join(conditions)}
398
+ ORDER BY seq_id ASC
399
+ """,
400
+ *params,
401
+ )
402
+ return [self._event_from_row(row) for row in rows]
403
+
352
404
  async def get_events(
353
405
  self,
354
406
  session_id: str,
@@ -687,148 +739,6 @@ class PostgresSessionService(BaseSessionService):
687
739
  f"could not connect to {mask_postgres_session_dsn(self.dsn)}"
688
740
  ) from exc
689
741
 
690
- async def _ensure_schema(self) -> None:
691
- if self._schema_ready:
692
- return
693
- async with self._schema_lock:
694
- if self._schema_ready:
695
- return
696
- await self._ensure_pool()
697
- async with self._pool.acquire() as connection:
698
- await connection.execute(f"""
699
- CREATE TABLE IF NOT EXISTS {KSADK_PG_SESSIONS_TABLE} (
700
- namespace TEXT NOT NULL,
701
- tenant_id TEXT NOT NULL DEFAULT 'default',
702
- workspace_id TEXT NOT NULL DEFAULT 'default',
703
- id TEXT NOT NULL,
704
- agent_id TEXT NOT NULL,
705
- user_id TEXT NOT NULL,
706
- title TEXT NOT NULL DEFAULT '',
707
- title_source TEXT NOT NULL DEFAULT '',
708
- summary TEXT NOT NULL DEFAULT '',
709
- first_prompt TEXT NOT NULL DEFAULT '',
710
- last_prompt TEXT NOT NULL DEFAULT '',
711
- state_json JSONB NOT NULL DEFAULT '{{}}'::jsonb,
712
- created_at DOUBLE PRECISION NOT NULL,
713
- updated_at DOUBLE PRECISION NOT NULL,
714
- version INTEGER NOT NULL DEFAULT 0,
715
- PRIMARY KEY (namespace, id)
716
- );
717
-
718
- CREATE TABLE IF NOT EXISTS {KSADK_PG_EVENTS_TABLE} (
719
- namespace TEXT NOT NULL,
720
- tenant_id TEXT NOT NULL DEFAULT 'default',
721
- workspace_id TEXT NOT NULL DEFAULT 'default',
722
- id TEXT NOT NULL,
723
- session_id TEXT NOT NULL,
724
- author TEXT NOT NULL,
725
- event_type TEXT NOT NULL,
726
- content_json JSONB NOT NULL DEFAULT '{{}}'::jsonb,
727
- timestamp DOUBLE PRECISION NOT NULL,
728
- state_delta_json JSONB NOT NULL DEFAULT '{{}}'::jsonb,
729
- seq_id INTEGER NOT NULL,
730
- invocation_id TEXT,
731
- metadata_json JSONB NOT NULL DEFAULT '{{}}'::jsonb,
732
- PRIMARY KEY (namespace, id),
733
- UNIQUE (namespace, session_id, seq_id),
734
- FOREIGN KEY (namespace, session_id)
735
- REFERENCES {KSADK_PG_SESSIONS_TABLE}(namespace, id)
736
- ON DELETE CASCADE
737
- );
738
-
739
- CREATE INDEX IF NOT EXISTS idx_ksadk_pg_events_session_seq
740
- ON {KSADK_PG_EVENTS_TABLE} (namespace, session_id, seq_id);
741
-
742
- -- 跨会话事件查询(get_events_for_agent)需 JOIN sessions 按
743
- -- s.agent_id 过滤并按 e.timestamp 排序;events 表无 agent_id 列,
744
- -- 覆盖索引 (namespace, session_id, timestamp, id) 服务 JOIN 键
745
- -- s.id=e.session_id + ORDER BY e.timestamp DESC。
746
- CREATE INDEX IF NOT EXISTS idx_ksadk_pg_events_session_ts
747
- ON {KSADK_PG_EVENTS_TABLE} (namespace, session_id, timestamp, id);
748
-
749
- -- ListSessions 归并按 agent_id 过滤 + updated_at DESC 排序;
750
- -- sessions 表 PK 是 (namespace, id),缺 agent_id 前缀索引。
751
- CREATE INDEX IF NOT EXISTS idx_ksadk_pg_sessions_agent_updated
752
- ON {KSADK_PG_SESSIONS_TABLE} (namespace, agent_id, updated_at DESC, id);
753
-
754
- CREATE TABLE IF NOT EXISTS {KSADK_PG_STATES_TABLE} (
755
- namespace TEXT NOT NULL,
756
- tenant_id TEXT NOT NULL DEFAULT 'default',
757
- workspace_id TEXT NOT NULL DEFAULT 'default',
758
- scope TEXT NOT NULL,
759
- agent_id TEXT NOT NULL,
760
- user_id TEXT NOT NULL DEFAULT '',
761
- session_id TEXT NOT NULL DEFAULT '',
762
- state_json JSONB NOT NULL DEFAULT '{{}}'::jsonb,
763
- version INTEGER NOT NULL DEFAULT 0,
764
- updated_at DOUBLE PRECISION NOT NULL,
765
- PRIMARY KEY (namespace, scope, agent_id, user_id, session_id)
766
- );
767
-
768
- ALTER TABLE {KSADK_PG_SESSIONS_TABLE}
769
- ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'default';
770
- ALTER TABLE {KSADK_PG_SESSIONS_TABLE}
771
- ADD COLUMN IF NOT EXISTS workspace_id TEXT NOT NULL DEFAULT 'default';
772
- ALTER TABLE {KSADK_PG_EVENTS_TABLE}
773
- ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'default';
774
- ALTER TABLE {KSADK_PG_EVENTS_TABLE}
775
- ADD COLUMN IF NOT EXISTS workspace_id TEXT NOT NULL DEFAULT 'default';
776
- ALTER TABLE {KSADK_PG_STATES_TABLE}
777
- ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'default';
778
- ALTER TABLE {KSADK_PG_STATES_TABLE}
779
- ADD COLUMN IF NOT EXISTS workspace_id TEXT NOT NULL DEFAULT 'default';
780
- """)
781
- try:
782
- await connection.execute(f"""
783
- CREATE OR REPLACE VIEW {PG_READABLE_EVENTS_VIEW} AS
784
- SELECT
785
- event_row.namespace,
786
- event_row.tenant_id,
787
- event_row.workspace_id,
788
- session_row.agent_id,
789
- session_row.user_id,
790
- session_row.title AS session_title,
791
- event_row.session_id,
792
- event_row.seq_id,
793
- event_row.id AS event_id,
794
- event_row.invocation_id,
795
- event_row.author,
796
- event_row.event_type,
797
- CASE
798
- WHEN event_row.event_type = 'user_message' THEN 'user'
799
- WHEN event_row.event_type IN (
800
- 'assistant_message', 'reasoning', 'tool_call'
801
- ) THEN 'assistant'
802
- WHEN event_row.event_type = 'tool_result' THEN 'tool'
803
- ELSE NULL
804
- END AS message_role,
805
- COALESCE(
806
- NULLIF(event_row.content_json #>> '{{parts,0,text}}', ''),
807
- NULLIF(event_row.content_json ->> 'text', ''),
808
- NULLIF(event_row.metadata_json ->> 'reasoning', ''),
809
- NULLIF(event_row.metadata_json ->> 'tool_output', '')
810
- ) AS message_text,
811
- event_row.metadata_json ->> 'tool_name' AS tool_name,
812
- CASE
813
- WHEN event_row.event_type = 'run_status' THEN COALESCE(
814
- event_row.content_json ->> 'status',
815
- event_row.metadata_json ->> 'status'
816
- )
817
- ELSE NULL
818
- END AS lifecycle_status,
819
- to_timestamp(event_row.timestamp) AS created_at,
820
- event_row.content_json,
821
- event_row.state_delta_json,
822
- event_row.metadata_json
823
- FROM {KSADK_PG_EVENTS_TABLE} AS event_row
824
- JOIN {KSADK_PG_SESSIONS_TABLE} AS session_row
825
- ON session_row.namespace = event_row.namespace
826
- AND session_row.id = event_row.session_id;
827
- """)
828
- except Exception as exc:
829
- logger.warning("Postgres readable session view unavailable: %s", exc)
830
- self._schema_ready = True
831
-
832
742
  async def _get_session_with_connection(
833
743
  self,
834
744
  connection: Any,
@@ -4,7 +4,12 @@ import asyncio
4
4
  import logging
5
5
  from typing import Any, Optional, cast
6
6
 
7
- from ksadk.sessions.base import BaseSessionService, Session, SessionEvent, SessionState
7
+ from ksadk.sessions.base import (
8
+ BaseSessionService,
9
+ Session,
10
+ SessionEvent,
11
+ SessionState,
12
+ )
8
13
  from ksadk.sessions.in_memory import InMemorySessionService
9
14
  from ksadk.sessions.resilience import is_session_backend_failure
10
15
 
@@ -40,6 +45,12 @@ class ResilientSessionService(BaseSessionService):
40
45
  def degraded(self) -> bool:
41
46
  return not self._primary_enabled
42
47
 
48
+ # This service is intentionally live-first and writes two independently
49
+ # sequenced stores. Even when both children can atomically bind a local
50
+ # seq, the wrapper cannot guarantee one shared physical seq/fact across
51
+ # both writes, so it inherits BaseSessionService's empty canonical storage
52
+ # capabilities and RuntimeEventStore fails closed before either write.
53
+
43
54
  async def _call_primary(self, method_name: str, *args: Any, **kwargs: Any) -> tuple[bool, Any]:
44
55
  if not self._primary_enabled:
45
56
  return False, None
@@ -260,6 +271,29 @@ class ResilientSessionService(BaseSessionService):
260
271
  await self._call_primary("append_event", session_id, event)
261
272
  return live
262
273
 
274
+ async def get_event_by_id(self, session_id: str, event_id: str) -> Optional[SessionEvent]:
275
+ if await self.fallback.get_session_metadata(session_id) is None:
276
+ await self.get_session(session_id)
277
+ return await self.fallback.get_event_by_id(session_id, event_id)
278
+
279
+ async def get_events_by_invocation_id(
280
+ self,
281
+ session_id: str,
282
+ invocation_id: str,
283
+ *,
284
+ after_seq_id: Optional[int] = None,
285
+ before_seq_id: Optional[int] = None,
286
+ ) -> list[SessionEvent]:
287
+ # ResilientSessionService is explicitly live-first: hydrate any durable
288
+ # prefix, then read the indexed in-memory authority used by get_events.
289
+ await self.get_session(session_id)
290
+ return await self.fallback.get_events_by_invocation_id(
291
+ session_id,
292
+ invocation_id,
293
+ after_seq_id=after_seq_id,
294
+ before_seq_id=before_seq_id,
295
+ )
296
+
263
297
  async def get_events(
264
298
  self,
265
299
  session_id: str,
@@ -77,7 +77,7 @@ class E2BSkillRuntimeBackend:
77
77
  @classmethod
78
78
  def from_env(cls) -> "E2BSkillRuntimeBackend":
79
79
  try:
80
- from e2b import Sandbox # type: ignore[import-untyped]
80
+ from e2b import Sandbox # type: ignore[import-not-found, import-untyped]
81
81
  except ImportError as exc:
82
82
  raise SkillRuntimeError(
83
83
  "e2b>=2.15.3,<2.25.0 is required for KSADK_SKILL_RUNTIME_BACKEND=e2b"
@@ -18,6 +18,12 @@ _KOP_HOSTS = frozenset(
18
18
  "aicp.api.ksyun.com",
19
19
  }
20
20
  )
21
+ _PRIVATE_KOP_HOSTS = frozenset(
22
+ {
23
+ "aicp.inner.api.ksyun.com",
24
+ "aicp.internal.api.ksyun.com",
25
+ }
26
+ )
21
27
 
22
28
 
23
29
  class SkillServiceClient:
@@ -215,14 +221,18 @@ class SkillServiceClient:
215
221
  return self._requests_session
216
222
 
217
223
  def _is_kop_mode(self) -> bool:
218
- """Match only exact, TLS-protected AICP control-plane endpoints.
224
+ """Match only exact AICP control-plane endpoints.
219
225
 
220
226
  A user-controlled URL such as ``aicp.api.ksyun.com.attacker.example``
221
- must never receive KOP signing headers.
227
+ must never receive KOP signing headers. Public AICP requires TLS; the
228
+ private ``inner`` and ``internal`` endpoints also support their existing
229
+ in-cluster HTTP transport.
222
230
  """
223
231
  parsed = urlsplit(self.base_url)
224
232
  host = (parsed.hostname or "").lower()
225
- return parsed.scheme == "https" and host in _KOP_HOSTS
233
+ return host in _KOP_HOSTS and (
234
+ parsed.scheme == "https" or (parsed.scheme == "http" and host in _PRIVATE_KOP_HOSTS)
235
+ )
226
236
 
227
237
  def _kop_base_url(self) -> str:
228
238
  parsed = urlsplit(self.base_url)
@@ -0,0 +1,5 @@
1
+ """Local-first AgentKit Studio control plane."""
2
+
3
+ from ksadk.studio.contracts import AgentDraft, AgentSpec
4
+
5
+ __all__ = ["AgentDraft", "AgentSpec"]
@@ -0,0 +1,120 @@
1
+ """Validated, content-addressed assets for Studio Agent avatars."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import io
7
+ import re
8
+ import warnings
9
+ from pathlib import Path
10
+
11
+ from PIL import Image, UnidentifiedImageError
12
+
13
+ from ksadk.studio.errors import StudioError, not_found
14
+ from ksadk.studio.workspace import Workspace
15
+
16
+
17
+ class AgentAvatarAssetStore:
18
+ MAX_BYTES = 2 * 1024 * 1024
19
+ MIN_EDGE = 32
20
+ MAX_EDGE = 2048
21
+ _ASSET_NAME = re.compile(r"^(?P<digest>[0-9a-f]{64})\.(?P<extension>png|webp)$")
22
+ _MIME_BY_FORMAT = {"PNG": "image/png", "WEBP": "image/webp"}
23
+ _EXTENSION_BY_FORMAT = {"PNG": "png", "WEBP": "webp"}
24
+
25
+ def __init__(self, workspace: Workspace) -> None:
26
+ self.workspace = workspace
27
+
28
+ def store(self, content: bytes, *, content_type: str) -> dict:
29
+ if not content:
30
+ raise StudioError(
31
+ "AGENT_AVATAR_EMPTY",
32
+ "头像文件不能为空",
33
+ status_code=422,
34
+ field="file",
35
+ )
36
+ if len(content) > self.MAX_BYTES:
37
+ raise StudioError(
38
+ "AGENT_AVATAR_TOO_LARGE",
39
+ "头像文件不能超过 2 MiB",
40
+ status_code=413,
41
+ field="file",
42
+ details={"maxBytes": self.MAX_BYTES},
43
+ )
44
+ normalized_type = content_type.split(";", 1)[0].strip().lower()
45
+ if normalized_type not in self._MIME_BY_FORMAT.values():
46
+ raise StudioError(
47
+ "AGENT_AVATAR_TYPE_UNSUPPORTED",
48
+ "头像仅支持 PNG 或 WebP",
49
+ status_code=415,
50
+ field="file",
51
+ )
52
+ try:
53
+ with warnings.catch_warnings():
54
+ warnings.simplefilter("error", Image.DecompressionBombWarning)
55
+ with Image.open(io.BytesIO(content)) as image:
56
+ image.load()
57
+ image_format = str(image.format or "").upper()
58
+ width, height = image.size
59
+ except (
60
+ UnidentifiedImageError,
61
+ OSError,
62
+ Image.DecompressionBombError,
63
+ Image.DecompressionBombWarning,
64
+ ) as exc:
65
+ raise StudioError(
66
+ "AGENT_AVATAR_INVALID",
67
+ "头像文件不是有效图片",
68
+ status_code=422,
69
+ field="file",
70
+ ) from exc
71
+
72
+ expected_type = self._MIME_BY_FORMAT.get(image_format)
73
+ if expected_type is None or expected_type != normalized_type:
74
+ raise StudioError(
75
+ "AGENT_AVATAR_TYPE_MISMATCH",
76
+ "头像内容与文件类型不一致",
77
+ status_code=422,
78
+ field="file",
79
+ )
80
+ if width != height:
81
+ raise StudioError(
82
+ "AGENT_AVATAR_NOT_SQUARE",
83
+ "头像必须裁剪为 1:1 正方形",
84
+ status_code=422,
85
+ field="file",
86
+ details={"width": width, "height": height},
87
+ )
88
+ if width < self.MIN_EDGE or width > self.MAX_EDGE:
89
+ raise StudioError(
90
+ "AGENT_AVATAR_DIMENSIONS_INVALID",
91
+ "头像边长必须在 32 到 2048 像素之间",
92
+ status_code=422,
93
+ field="file",
94
+ details={"width": width, "height": height},
95
+ )
96
+
97
+ digest = hashlib.sha256(content).hexdigest()
98
+ extension = self._EXTENSION_BY_FORMAT[image_format]
99
+ asset_name = f"{digest}.{extension}"
100
+ path = self.workspace.resolve(Path(".agentkit/assets/agent-avatars") / asset_name)
101
+ if not path.is_file():
102
+ self.workspace.atomic_write_bytes(path, content)
103
+ return {
104
+ "digest": digest,
105
+ "url": f"/api/v1/assets/agent-avatars/{asset_name}",
106
+ "mimeType": expected_type,
107
+ "size": len(content),
108
+ "width": width,
109
+ "height": height,
110
+ }
111
+
112
+ def get(self, asset_name: str) -> tuple[Path, str]:
113
+ match = self._ASSET_NAME.fullmatch(asset_name)
114
+ if match is None:
115
+ raise not_found("agent-avatar", asset_name)
116
+ extension = match.group("extension")
117
+ path = self.workspace.resolve(Path(".agentkit/assets/agent-avatars") / asset_name)
118
+ if not path.is_file():
119
+ raise not_found("agent-avatar", asset_name)
120
+ return path, "image/png" if extension == "png" else "image/webp"
@@ -0,0 +1,51 @@
1
+ """Recoverable deletion for generic Studio Agents."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime, timezone
6
+ from pathlib import Path
7
+ from typing import Any
8
+
9
+ from ksadk.studio.contracts import RunStatus
10
+ from ksadk.studio.errors import StudioError
11
+
12
+
13
+ def delete_framework_agent(studio: Any, agent_id: str, *, purge: bool) -> None:
14
+ studio.drafts.get(agent_id)
15
+ running = [
16
+ run.id
17
+ for run in studio.event_store.list_runs(agent_id=agent_id)
18
+ if run.status in {RunStatus.CREATED, RunStatus.RUNNING}
19
+ ]
20
+ if running:
21
+ raise StudioError(
22
+ "AGENT_RUN_ACTIVE",
23
+ "Agent 仍有运行中的任务,请等待运行结束后再删除",
24
+ status_code=409,
25
+ details={"agentId": agent_id, "runIds": running},
26
+ )
27
+ trash_directory = None
28
+ if not purge:
29
+ timestamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%S%fZ")
30
+ trash_directory = studio.workspace.resolve(
31
+ Path(".agentkit/trash/agents") / f"{agent_id}-{timestamp}"
32
+ )
33
+ trash_directory.mkdir(parents=True, exist_ok=False)
34
+ studio.event_store.delete_agent(
35
+ agent_id,
36
+ purge=purge,
37
+ trash_directory=trash_directory,
38
+ )
39
+ studio.builds.delete_for_agent(
40
+ agent_id,
41
+ purge=purge,
42
+ trash_directory=trash_directory,
43
+ )
44
+ studio.drafts.delete(
45
+ agent_id,
46
+ purge=purge,
47
+ trash_directory=trash_directory,
48
+ )
49
+
50
+
51
+ __all__ = ["delete_framework_agent"]