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
@@ -0,0 +1,443 @@
1
+ """Runner Context Capabilities —— Prompt/Context/Memory 的 ownership 合同。
2
+
3
+ 能力声明是可执行合同,不是展示标签:Runtime 按 ``ContextCapabilities`` 决定是否
4
+ 编译/投影 Prompt、是否注入 History/Memory、是否执行 compaction。
5
+
6
+ 本模块只落地数据模型与已知 Runner 的显式默认值;任何行为型接入(实际改写 Runner 输入、
7
+ 按 capability 切换 ambient 注入、双阈值等)都在后续 PR,第一个 PR 仅做声明与 shadow 观测,
8
+ 不改线上行为。未知自定义 Runner 默认采用最保守的 ``framework_assisted + opaque``。
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from dataclasses import dataclass
14
+ from typing import Any, Literal
15
+
16
+ DeploymentMode = Literal["local", "ksadk_managed_cloud", "external_managed"]
17
+ """部署位置(方案 §4.3 / §6.1)。
18
+
19
+ 与 Context ownership 正交:描述实例在哪里运行、谁负责构建/扩缩容/运维,不描述谁拥有最终
20
+ 模型输入。``local`` / ``ksadk_managed_cloud`` / ``external_managed``。不得据字符串判断
21
+ Context owner(``ksadk_managed_cloud`` 不自动等于 ``ksadk_owned``)。
22
+ """
23
+
24
+ ContextIntegrationMode = Literal["ksadk_hosted", "framework_assisted", "native_runtime"]
25
+ """KsADK 对最终模型输入的控制程度。
26
+
27
+ - ``ksadk_hosted``: KsADK 负责编译 Prompt、候选选择、预算、compaction 和最终输入组装。
28
+ - ``framework_assisted``: KsADK 提供统一 CompiledPrompt/Policy/Memory/观测,框架负责
29
+ 投影到原生 instruction/state/store。
30
+ - ``native_runtime``: KsADK 只传递版本化 instructions、平台边界和外部 Memory hook,
31
+ 原生 Runtime 持有 Agent loop/history/compaction/最终输入。
32
+ """
33
+
34
+ ContextOwner = Literal["ksadk", "framework", "native"]
35
+ """某一关注点(prompt/history/compaction/memory/skill)的实际所有者。"""
36
+
37
+ ContextAccuracy = Literal["exact", "runtime_reported", "estimated", "opaque"]
38
+ """Context 观测精度等级(方案 6.3)。
39
+
40
+ - ``exact``: KsADK 生成最终模型输入并用匹配 tokenizer 计算。
41
+ - ``runtime_reported``: 原生 Runtime/模型返回了实际 usage 或 context 统计。
42
+ - ``estimated``: KsADK 只能对提交给 Runner 的内容做启发式估算。
43
+ - ``opaque``: Runner 不暴露最终输入或可靠 usage,只记录来源/hash/能力缺口。
44
+ """
45
+
46
+
47
+ @dataclass(frozen=True)
48
+ class ContextCapabilities:
49
+ """单个 Runner 的 Context 接入能力与 ownership 声明。
50
+
51
+ 必须由 Runner 实现或由 KsADK 为已知 Runner 提供显式默认值,不能仅靠 ``hasattr``
52
+ 猜测。若实际 usage 或事件证明声明不一致,应记录 ``context.capability_mismatch``
53
+ 并停止对该 Runner 启用行为型 Context Engine(该熔断逻辑留后续 PR)。
54
+ """
55
+
56
+ integration_mode: ContextIntegrationMode
57
+ prompt_owner: ContextOwner
58
+ history_owner: ContextOwner
59
+ compaction_owner: ContextOwner
60
+ memory_owner: ContextOwner
61
+ skill_owner: ContextOwner
62
+ # Runner 投影 Prompt 时实际使用的目标 SDK 承载形式,例如
63
+ # ``{"system_message","state"}`` / ``{"instruction","session","memory_service"}`` /
64
+ # ``{"base_instructions","thread"}``。空集表示未知/不投影。
65
+ prompt_projection: frozenset[str]
66
+ memory_read: bool
67
+ memory_write: bool
68
+ core_memory: bool
69
+ native_skills: bool
70
+ token_accounting: ContextAccuracy
71
+ supports_context_snapshot: bool
72
+
73
+
74
+ def DEFAULT_CONTEXT_CAPABILITIES() -> ContextCapabilities:
75
+ """未知自定义 Runner 的保守合同:framework_assisted + opaque,不启用任何行为型接入。"""
76
+ return ContextCapabilities(
77
+ integration_mode="framework_assisted",
78
+ prompt_owner="framework",
79
+ history_owner="framework",
80
+ compaction_owner="framework",
81
+ memory_owner="framework",
82
+ skill_owner="framework",
83
+ prompt_projection=frozenset(),
84
+ memory_read=False,
85
+ memory_write=False,
86
+ core_memory=False,
87
+ native_skills=False,
88
+ token_accounting="opaque",
89
+ supports_context_snapshot=False,
90
+ )
91
+
92
+
93
+ def adk_context_capabilities() -> ContextCapabilities:
94
+ """Google ADK:framework_assisted。
95
+
96
+ instructions 拼进 new_message 文本 + agent.instruction 加载时改写;history 由 ADK
97
+ SessionService 拥有(忽略 payload.history);STM/LTM 作为 memory_service 注入 +
98
+ load/save_memory 工具;skills 完整注入(manifest 仅 name/desc/version);无 compaction。
99
+ """
100
+ return ContextCapabilities(
101
+ integration_mode="framework_assisted",
102
+ prompt_owner="framework",
103
+ history_owner="framework",
104
+ compaction_owner="framework",
105
+ memory_owner="framework",
106
+ skill_owner="framework",
107
+ prompt_projection=frozenset({"instruction", "session", "memory_service"}),
108
+ memory_read=True,
109
+ memory_write=True,
110
+ core_memory=False,
111
+ native_skills=True,
112
+ token_accounting="runtime_reported",
113
+ supports_context_snapshot=True,
114
+ )
115
+
116
+
117
+ def langgraph_context_capabilities() -> ContextCapabilities:
118
+ """LangGraph:framework_assisted,KsADK 侧参与 prompt/history/compaction 投影。
119
+
120
+ instructions→SystemMessage(或 ``ksadk_prepare_state`` hook);history 由 runner
121
+ 组装(history dict→HumanMessage/AIMessage);memory=checkpointer + memory_context
122
+ payload 字段;无 skills;无 compaction。
123
+ """
124
+ return ContextCapabilities(
125
+ integration_mode="framework_assisted",
126
+ prompt_owner="ksadk",
127
+ history_owner="ksadk",
128
+ compaction_owner="ksadk",
129
+ memory_owner="framework",
130
+ skill_owner="framework",
131
+ prompt_projection=frozenset({"system_message", "state"}),
132
+ memory_read=True,
133
+ memory_write=False,
134
+ core_memory=False,
135
+ native_skills=False,
136
+ token_accounting="estimated",
137
+ supports_context_snapshot=True,
138
+ )
139
+
140
+
141
+ def langchain_context_capabilities() -> ContextCapabilities:
142
+ """LangChain:framework_assisted,继承 LangGraph 的 prompt 投影但 history/compaction 交框架。"""
143
+ return ContextCapabilities(
144
+ integration_mode="framework_assisted",
145
+ prompt_owner="ksadk",
146
+ history_owner="framework",
147
+ compaction_owner="framework",
148
+ memory_owner="framework",
149
+ skill_owner="framework",
150
+ prompt_projection=frozenset({"system_message", "state"}),
151
+ memory_read=False,
152
+ memory_write=False,
153
+ core_memory=False,
154
+ native_skills=False,
155
+ token_accounting="estimated",
156
+ supports_context_snapshot=False,
157
+ )
158
+
159
+
160
+ def deepagents_context_capabilities() -> ContextCapabilities:
161
+ """DeepAgents:framework_assisted,LangGraph 系编译图,history/compaction 交框架。"""
162
+ return ContextCapabilities(
163
+ integration_mode="framework_assisted",
164
+ prompt_owner="ksadk",
165
+ history_owner="framework",
166
+ compaction_owner="framework",
167
+ memory_owner="framework",
168
+ skill_owner="framework",
169
+ prompt_projection=frozenset({"system_message", "state"}),
170
+ memory_read=False,
171
+ memory_write=False,
172
+ core_memory=False,
173
+ native_skills=False,
174
+ token_accounting="estimated",
175
+ supports_context_snapshot=False,
176
+ )
177
+
178
+
179
+ def codex_context_capabilities() -> ContextCapabilities:
180
+ """Codex:native_runtime。
181
+
182
+ base_instructions 移交后端 thread;history 由后端 thread_id 拥有;无 memory hook;
183
+ 无 skills 暴露;compaction 后端拥有。KsADK 不重复注入完整 Transcript、不运行第二套
184
+ compaction。
185
+ """
186
+ return ContextCapabilities(
187
+ integration_mode="native_runtime",
188
+ prompt_owner="native",
189
+ history_owner="native",
190
+ compaction_owner="native",
191
+ memory_owner="native",
192
+ skill_owner="native",
193
+ prompt_projection=frozenset({"base_instructions", "thread"}),
194
+ memory_read=False,
195
+ memory_write=False,
196
+ core_memory=False,
197
+ native_skills=True,
198
+ token_accounting="runtime_reported",
199
+ supports_context_snapshot=True,
200
+ )
201
+
202
+
203
+ # detection_result.type.value → 已知 Runner capability 工厂。显式枚举,不靠 hasattr。
204
+ _KNOWN_RUNNER_CAPABILITIES: dict[str, Any] = {
205
+ "adk": adk_context_capabilities,
206
+ "langgraph": langgraph_context_capabilities,
207
+ "langchain": langchain_context_capabilities,
208
+ "deepagents": deepagents_context_capabilities,
209
+ "codex": codex_context_capabilities,
210
+ }
211
+
212
+
213
+ def _runner_type_value(runner: Any) -> str:
214
+ """读取 runner.detection_result.type.value,兼容缺失字段。返回小写字符串。"""
215
+ detection_result = getattr(runner, "detection_result", None)
216
+ if detection_result is None:
217
+ return ""
218
+ detection_type = getattr(detection_result, "type", None)
219
+ if detection_type is None:
220
+ return ""
221
+ value = getattr(detection_type, "value", detection_type)
222
+ return str(value or "").strip().lower()
223
+
224
+
225
+ def _capabilities_for_detection_type(value: str) -> ContextCapabilities:
226
+ """按 detection_result.type.value 显式分派已知 Runner capability,未知走 DEFAULT。
227
+
228
+ 纯 registry 查找,不调用 runner 的 ``describe_context_capabilities``,因此无递归风险:
229
+ ``BaseRunner.describe_context_capabilities`` 默认实现直接走本函数。
230
+ """
231
+ factory = _KNOWN_RUNNER_CAPABILITIES.get(value)
232
+ if factory is not None:
233
+ return factory()
234
+ return DEFAULT_CONTEXT_CAPABILITIES()
235
+
236
+
237
+ def capabilities_for_runtime_type(runtime_type: str | None) -> ContextCapabilities:
238
+ """按 ``runtime_type``(平台边界 ``BaseRuntime.runtime_type``)显式分派 capability。
239
+
240
+ 对 framework runner,``runtime_type`` 与 ``detection_result.type.value`` 一致
241
+ (adk/langgraph/langchain/deepagents/codex),故 canonical conversation execution
242
+ 路径在 ``build_run_input`` 阶段(尚未拿到 adapter/runner 实例)也能取得正确 ownership,
243
+ 不落成默认 opaque。未知 runtime_type 走 DEFAULT。
244
+ """
245
+ normalized = str(runtime_type or "").strip().lower()
246
+ return _capabilities_for_detection_type(normalized)
247
+
248
+
249
+ _CAPABILITY_HASH_FIELDS: tuple[str, ...] = (
250
+ "integration_mode",
251
+ "prompt_owner",
252
+ "history_owner",
253
+ "compaction_owner",
254
+ "memory_owner",
255
+ "skill_owner",
256
+ "memory_read",
257
+ "memory_write",
258
+ "core_memory",
259
+ "native_skills",
260
+ "token_accounting",
261
+ "supports_context_snapshot",
262
+ )
263
+
264
+
265
+ def capability_hash(caps: ContextCapabilities) -> str:
266
+ """对 capability 稳定字段做 SHA-256,供 Plan/Trace 记录 ``capability_hash``。
267
+
268
+ ``prompt_projection`` 是 frozenset,按排序后元素拼接以保证确定性。不含 ``metadata``。
269
+ """
270
+ import hashlib
271
+ import json
272
+
273
+ payload = {field: getattr(caps, field) for field in _CAPABILITY_HASH_FIELDS}
274
+ projection = sorted(getattr(caps, "prompt_projection", frozenset()) or [])
275
+ payload["prompt_projection"] = projection
276
+ serialized = json.dumps(payload, sort_keys=True, ensure_ascii=False)
277
+ return "sha256:" + hashlib.sha256(serialized.encode("utf-8")).hexdigest()
278
+
279
+
280
+ def capabilities_for_runner(runner: Any | None) -> ContextCapabilities:
281
+ """统一 lookup:优先 runner 自身的 ``describe_context_capabilities()``,否则按 detection
282
+ type 显式分派,未知走 DEFAULT。
283
+
284
+ 不依赖 ``hasattr`` 猜测 ownership(方案 6.1)。``BaseRunner`` 的默认
285
+ ``describe_context_capabilities``
286
+ 走 ``_capabilities_for_detection_type``,故本函数对 BaseRunner 子类不会递归。已被 compaction
287
+ 门控(``runtime_preparation`` proactive compaction)与 shadow plan / conformance 测试消费。
288
+ """
289
+ if runner is None:
290
+ return DEFAULT_CONTEXT_CAPABILITIES()
291
+
292
+ describe = getattr(runner, "describe_context_capabilities", None)
293
+ if callable(describe):
294
+ try:
295
+ caps = describe()
296
+ except Exception:
297
+ caps = None
298
+ if isinstance(caps, ContextCapabilities):
299
+ return caps
300
+
301
+ return _capabilities_for_detection_type(_runner_type_value(runner))
302
+
303
+
304
+ # ---- Capability Mismatch 检测与熔断(方案 §6.1 / §8.3)----
305
+
306
+ # 进程内 best-effort 熔断记录:runner 标识 → 已熔断。只影响"是否对该 Runner 启用行为型
307
+ # Context Engine",不影响 shadow 观测与正常执行(方案 §6.1)。pod 重启清空。
308
+ _MISMATCH_CIRCUIT: dict[str, bool] = {}
309
+
310
+
311
+ def detect_capability_mismatch(
312
+ *,
313
+ declared: ContextCapabilities,
314
+ actual_prompt_owner: str | None = None,
315
+ actual_history_owner: str | None = None,
316
+ actual_compaction_owner: str | None = None,
317
+ runtime_reported_usage: bool | None = None,
318
+ duplicate_history_injected: bool = False,
319
+ double_compaction: bool = False,
320
+ ) -> str | None:
321
+ """检测声明的 capability 与运行时实际证据是否一致(方案 §6.1)。
322
+
323
+ 返回 mismatch 原因字符串(``prompt_owner``/``history_owner``/``compaction_owner``/
324
+ ``token_accounting``/``duplicate_history``/``double_compaction``);一致返回 ``None``。
325
+ 熔断由 ``mark_capability_mismatch`` / ``is_capability_circuit_open`` 表达。
326
+ """
327
+ reasons: list[str] = []
328
+ if actual_prompt_owner is not None and actual_prompt_owner != declared.prompt_owner:
329
+ reasons.append(f"prompt_owner:{declared.prompt_owner}!={actual_prompt_owner}")
330
+ if actual_history_owner is not None and actual_history_owner != declared.history_owner:
331
+ reasons.append(f"history_owner:{declared.history_owner}!={actual_history_owner}")
332
+ if actual_compaction_owner is not None and actual_compaction_owner != declared.compaction_owner:
333
+ reasons.append(f"compaction_owner:{declared.compaction_owner}!={actual_compaction_owner}")
334
+ if runtime_reported_usage is False and declared.token_accounting == "runtime_reported":
335
+ reasons.append("token_accounting:declared_runtime_reported_but_no_usage")
336
+ if duplicate_history_injected:
337
+ reasons.append("duplicate_history_injected")
338
+ if double_compaction:
339
+ reasons.append("double_compaction")
340
+ return ";".join(reasons) if reasons else None
341
+
342
+
343
+ def _mismatch_key(runner: Any | None, runtime_type: str | None) -> str:
344
+ rt = _runner_type_value(runner) if runner is not None else str(runtime_type or "")
345
+ return rt or "unknown"
346
+
347
+
348
+ def mark_capability_mismatch(runner: Any | None = None, runtime_type: str | None = None) -> None:
349
+ """标记某 Runner 触发 capability mismatch 熔断(方案 §6.1)。
350
+
351
+ 熔断后 ``is_capability_circuit_open`` 返回 True,行为型 Context Engine 对该 Runner 停用;
352
+ shadow 观测与正常 Runner 执行不受影响。
353
+ """
354
+ _MISMATCH_CIRCUIT[_mismatch_key(runner, runtime_type)] = True
355
+
356
+
357
+ def is_capability_circuit_open(runner: Any | None = None, runtime_type: str | None = None) -> bool:
358
+ """该 Runner 是否已因 capability mismatch 熔断(方案 §6.1)。"""
359
+ return _MISMATCH_CIRCUIT.get(_mismatch_key(runner, runtime_type), False)
360
+
361
+
362
+ def reset_capability_circuit(runner: Any | None = None, runtime_type: str | None = None) -> None:
363
+ """清除熔断标记(测试/运维用)。"""
364
+ key = _mismatch_key(runner, runtime_type)
365
+ _MISMATCH_CIRCUIT.pop(key, None)
366
+
367
+
368
+ # ---- Ownership 可选范围与校验(方案 §5.2:ownership 不允许任意选择)----
369
+
370
+ # 按 runtime_type 列出 Studio 可选 ownership(context.ownership 字段值)。
371
+ # auto = 由 capability 推导;ksadk/framework/native 必须与 capability 兼容。
372
+ _OWNERSHIP_CHOICES: dict[str, tuple[str, ...]] = {
373
+ "codex": ("native",),
374
+ "adk": ("framework",), # 后续开放 assisted
375
+ "langgraph": ("framework", "ksadk"),
376
+ "langchain": ("framework",),
377
+ "deepagents": ("framework",),
378
+ }
379
+
380
+
381
+ def allowed_ownership_choices(runtime_type: str | None) -> tuple[str, ...]:
382
+ """该 runtime 在 Studio 中可选的 ownership(方案 §5.2)。未知 runtime 走保守 framework。"""
383
+ key = str(runtime_type or "").strip().lower()
384
+ return _OWNERSHIP_CHOICES.get(key, ("framework",))
385
+
386
+
387
+ def validate_ownership_for_runtime(ownership: str, *, runtime_type: str | None) -> None:
388
+ """校验 ownership 与 runtime capability 兼容(方案 §5.2)。
389
+
390
+ 不支持组合时抛 ``ValueError``,Studio 据 it 返回 capability mismatch,不静默降级。
391
+ ``auto`` 总是合法(运行时按 capability 推导)。
392
+ """
393
+ if ownership == "auto":
394
+ return
395
+ allowed = allowed_ownership_choices(runtime_type)
396
+ if ownership not in allowed:
397
+ raise ValueError(
398
+ f"ownership={ownership!r} 不被 runtime={runtime_type!r} 支持;"
399
+ f"可选: {list(allowed)}(方案 §5.2)"
400
+ )
401
+
402
+
403
+ def resolve_ownership(ownership: str, *, runtime_type: str | None) -> str:
404
+ """把 ``context.ownership`` 解析为实际 prompt ownership(ksadk/framework/native)。
405
+
406
+ ``auto`` → 解析为该 runtime 的**保守产品默认**(方案 §5.2:langgraph/adk 默认 framework,
407
+ codex 默认 native),而非 capability 上限——capability 表示“能接管”,不代表“默认接管”。
408
+ 显式值原样返回(已由 ``validate_ownership_for_runtime`` 校验)。
409
+ """
410
+ if ownership == "auto":
411
+ rt = str(runtime_type or "").strip().lower()
412
+ if rt == "codex":
413
+ return "native"
414
+ return "framework" # langgraph/adk/langchain/deepagents 默认 framework
415
+ return ownership
416
+
417
+
418
+ def assert_capability_not_circuit_open(
419
+ *, runner: Any | None = None, runtime_type: str | None = None, label: str = ""
420
+ ) -> None:
421
+ """行为型 Context Engine 接入前的门禁(方案 §6.1)。
422
+
423
+ 若该 Runner 已因 capability mismatch 熔断,则抛 ``CapabilityCircuitOpen``——调用方据
424
+ 此回退 shadow/旧路径,**不**继续行为型接管。``label`` 仅用于错误信息,便于诊断是哪个接入点
425
+ 被熔断拦下。shadow 观测与正常 Runner 执行不受此门禁影响。
426
+ """
427
+ if is_capability_circuit_open(runner=runner, runtime_type=runtime_type):
428
+ raise CapabilityCircuitOpen(
429
+ runtime_type=_mismatch_key(runner, runtime_type),
430
+ label=label or "behavioral_context_engine",
431
+ )
432
+
433
+
434
+ class CapabilityCircuitOpen(RuntimeError):
435
+ """Runner 因 capability mismatch 被熔断,行为型 Context Engine 对其停用(方案 §6.1)。"""
436
+
437
+ def __init__(self, *, runtime_type: str, label: str) -> None:
438
+ self.runtime_type = runtime_type
439
+ self.label = label
440
+ super().__init__(
441
+ f"capability circuit open for runtime={runtime_type!r} at {label!r}; "
442
+ "behavioral context engine disabled for this runner"
443
+ )