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,467 @@
1
+ """Native RuntimeAdapter for YAML Harness agents."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import json
7
+ import time
8
+ import uuid
9
+ from dataclasses import dataclass
10
+ from pathlib import Path
11
+ from typing import Any
12
+
13
+ from ksadk.events.canonical import (
14
+ ErrorInfo,
15
+ ItemCompleted,
16
+ ItemStarted,
17
+ ItemUpdated,
18
+ OutputRef,
19
+ RunCanceled,
20
+ RunCompleted,
21
+ RunFailed,
22
+ RunStarted,
23
+ SourceRef,
24
+ )
25
+ from ksadk.events.content import (
26
+ ContentSnapshot,
27
+ TextContent,
28
+ ToolCallContent,
29
+ ToolResultContent,
30
+ )
31
+ from ksadk.events.identity import (
32
+ stable_event_id,
33
+ stable_item_id,
34
+ stable_scope_id,
35
+ )
36
+ from ksadk.harness.config import HarnessConfig
37
+ from ksadk.harness.reasoner import HarnessReasoner, LiteLLMHarnessReasoner
38
+ from ksadk.harness.sandbox import HarnessSandboxExecutor
39
+ from ksadk.harness.tools import HarnessTool, load_mcp_tools, sandbox_tools, tool_result_text
40
+ from ksadk.runtime import (
41
+ BaseRuntime,
42
+ CancelResult,
43
+ CheckpointCapability,
44
+ CheckpointDescriptor,
45
+ ResumePayload,
46
+ ResumeTarget,
47
+ RunHandle,
48
+ RuntimeAdapter,
49
+ StartRequest,
50
+ )
51
+
52
+ _MAX_REASONING_TURNS = 8
53
+
54
+
55
+ class HarnessRuntime(BaseRuntime):
56
+ runtime_type = "harness"
57
+
58
+ def native_capabilities(self) -> dict[str, Any]:
59
+ return {
60
+ "cancel": {"supported": True},
61
+ "resume": {"supported": False},
62
+ "checkpoint": {"supported": False, "granularity": "none"},
63
+ "session_continuity": {"durable": False, "scope": "process"},
64
+ }
65
+
66
+
67
+ @dataclass
68
+ class _HarnessRun:
69
+ request: StartRequest
70
+ task: asyncio.Task[dict[str, Any]] | None = None
71
+ pending_cancel: bool = False
72
+ done: bool = False
73
+
74
+
75
+ class HarnessRuntimeAdapter(RuntimeAdapter):
76
+ """Execute a YAML Harness config directly as RuntimeEvent streams."""
77
+
78
+ def __init__(
79
+ self,
80
+ config: HarnessConfig,
81
+ *,
82
+ agent_name: str = "harness-agent",
83
+ reasoner: HarnessReasoner | None = None,
84
+ workspace_root: str | Path = ".",
85
+ ) -> None:
86
+ super().__init__(HarnessRuntime())
87
+ self._config = config
88
+ self._agent_name = agent_name
89
+ self._reasoner = reasoner or LiteLLMHarnessReasoner()
90
+ self._sandbox = HarnessSandboxExecutor(
91
+ workspace_root=workspace_root,
92
+ read_only=config.sandbox.read_only,
93
+ )
94
+ self._runs: dict[str, _HarnessRun] = {}
95
+ self._tools: tuple[HarnessTool, ...] | None = None
96
+ self._tool_lock = asyncio.Lock()
97
+ self._mcp_toolsets: list[Any] = []
98
+
99
+ @property
100
+ def harness_config(self) -> HarnessConfig:
101
+ return self._config
102
+
103
+ @property
104
+ def sandbox(self) -> HarnessSandboxExecutor:
105
+ return self._sandbox
106
+
107
+ @property
108
+ def workspace_root(self) -> Path:
109
+ return self._sandbox.workspace_root
110
+
111
+ async def start(self, request: StartRequest) -> RunHandle:
112
+ run_id = str(request.metadata.get("invocation_id") or f"harness_{uuid.uuid4().hex}")
113
+ if run_id in self._runs:
114
+ raise ValueError(f"duplicate Harness invocation: {run_id}")
115
+ self._runs[run_id] = _HarnessRun(request=request)
116
+ return RunHandle(
117
+ run_id=run_id,
118
+ session_id=request.session_id,
119
+ runtime_type="harness",
120
+ native_ref={"user_id": request.user_id, "agent_id": request.agent_id},
121
+ )
122
+
123
+ def stream(self, handle: RunHandle):
124
+ return self._stream(handle)
125
+
126
+ async def cancel(self, handle: RunHandle) -> CancelResult:
127
+ run = self._runs.get(handle.run_id)
128
+ if run is None or run.done:
129
+ return CancelResult.NOT_RUNNING
130
+ if run.task is None:
131
+ run.pending_cancel = True
132
+ return CancelResult.PENDING_CANCEL_RECORDED
133
+ if run.task.done():
134
+ return CancelResult.NOT_RUNNING
135
+ run.task.cancel()
136
+ return CancelResult.INTERRUPTED_ACTIVE_TURN
137
+
138
+ async def resume(
139
+ self,
140
+ handle: RunHandle,
141
+ target: ResumeTarget,
142
+ payload: ResumePayload | None,
143
+ ) -> RunHandle:
144
+ del handle, target, payload
145
+ raise RuntimeError("Harness runtime does not support resume")
146
+
147
+ async def checkpoint(self, handle: RunHandle) -> CheckpointDescriptor:
148
+ return CheckpointDescriptor(
149
+ checkpoint_id=f"unsupported:{handle.run_id}",
150
+ invocation_id=handle.run_id,
151
+ capability=CheckpointCapability(
152
+ supported=False,
153
+ granularity="none",
154
+ rollback_scope="none",
155
+ fork_supported=False,
156
+ durable=False,
157
+ shared_across_pods=False,
158
+ reason="Harness runtime has no checkpoint backend",
159
+ ),
160
+ )
161
+
162
+ async def close(self, handle: RunHandle) -> None:
163
+ run = self._runs.pop(handle.run_id, None)
164
+ if run is not None and run.task is not None and not run.task.done():
165
+ run.task.cancel()
166
+ await asyncio.gather(run.task, return_exceptions=True)
167
+ if not self._runs:
168
+ await self._close_tools()
169
+
170
+ def is_handle_attached(self, handle: RunHandle) -> bool:
171
+ return handle.run_id in self._runs
172
+
173
+ async def execute_request(self, request: StartRequest) -> dict[str, Any]:
174
+ tools = await self._ensure_tools()
175
+ model, prompt = self._effective(request)
176
+ messages: list[dict[str, Any]] = [
177
+ {"role": "system", "content": prompt},
178
+ {"role": "user", "content": str(request.input or "")},
179
+ ]
180
+ execution_log: list[dict[str, Any]] = []
181
+
182
+ for _turn_number in range(_MAX_REASONING_TURNS):
183
+ turn = await self._reasoner.complete(
184
+ model=model,
185
+ prompt=prompt,
186
+ messages=tuple(messages),
187
+ tools=tools,
188
+ )
189
+ if turn.tool_calls:
190
+ messages.append(
191
+ {
192
+ "role": "assistant",
193
+ "content": turn.final_text,
194
+ "tool_calls": [
195
+ {
196
+ "id": call.call_id,
197
+ "type": "function",
198
+ "function": {
199
+ "name": call.name,
200
+ "arguments": json.dumps(call.arguments, ensure_ascii=False),
201
+ },
202
+ }
203
+ for call in turn.tool_calls
204
+ ],
205
+ }
206
+ )
207
+ for call in turn.tool_calls:
208
+ tool = next((item for item in tools if item.name == call.name), None)
209
+ if tool is None:
210
+ raise RuntimeError(
211
+ f"Harness tool {call.name!r} is not available; it may be filtered "
212
+ "or was not exposed by its MCP server"
213
+ )
214
+ result = await tool.call(call.arguments, call_id=call.call_id)
215
+ content = tool_result_text(result)
216
+ execution_log.append(
217
+ {
218
+ "call_id": call.call_id,
219
+ "name": call.name,
220
+ "source": tool.source,
221
+ "arguments": dict(call.arguments),
222
+ "result": result,
223
+ }
224
+ )
225
+ messages.append(
226
+ {
227
+ "role": "tool",
228
+ "tool_call_id": call.call_id,
229
+ "name": call.name,
230
+ "content": content,
231
+ }
232
+ )
233
+ continue
234
+ if turn.final_text is None:
235
+ raise RuntimeError(
236
+ "Harness reasoner returned neither a final response nor a tool call"
237
+ )
238
+ return {
239
+ "output": turn.final_text,
240
+ "model": model,
241
+ "prompt": prompt,
242
+ "tool_calls": execution_log,
243
+ "sandbox_read_only": self._config.sandbox.read_only,
244
+ }
245
+ raise RuntimeError(f"Harness reasoning exceeded {_MAX_REASONING_TURNS} turns")
246
+
247
+ def _effective(self, request: StartRequest) -> tuple[str, str]:
248
+ metadata = request.metadata or {}
249
+ model = str(
250
+ metadata.get("model_override") or request.model or self._config.model
251
+ ).strip()
252
+ prompt = str(
253
+ metadata.get("prompt_override")
254
+ or request.config.get("base_instructions")
255
+ or request.config.get("instructions")
256
+ or request.config.get("prompt")
257
+ or self._config.prompt
258
+ ).strip()
259
+ return model, prompt
260
+
261
+ async def _stream(self, handle: RunHandle):
262
+ run = self._require_run(handle)
263
+ framework = "ksadk"
264
+ run_id = handle.run_id
265
+ scope_id = stable_scope_id(framework, run_id)
266
+ message_item_id = stable_item_id(framework, run_id, "message", "final_answer")
267
+ run_item_id = stable_item_id(framework, run_id, "$run")
268
+ seq = 0
269
+ started_items: set[tuple[str, str]] = set()
270
+
271
+ def next_seq() -> int:
272
+ nonlocal seq
273
+ seq += 1
274
+ return seq
275
+
276
+ def make_source() -> SourceRef:
277
+ return SourceRef(
278
+ framework=framework,
279
+ native_run_id=run_id,
280
+ metadata={
281
+ "agent_id": str(run.request.agent_id or self._agent_name),
282
+ "user_id": run.request.user_id,
283
+ "session_id": run.request.session_id,
284
+ "invocation_id": run_id,
285
+ },
286
+ )
287
+
288
+ def env_kwargs(
289
+ item_id: str, event_type: str, part_id: str
290
+ ) -> dict[str, Any]:
291
+ n = next_seq()
292
+ return {
293
+ "schema_version": 2,
294
+ "event_id": stable_event_id(
295
+ framework, scope_id, item_id, event_type, part_id, run_id, n
296
+ ),
297
+ "seq": n,
298
+ "timestamp": time.time(),
299
+ "run_id": run_id,
300
+ "scope_id": scope_id,
301
+ "source": make_source(),
302
+ }
303
+
304
+ def ensure_started(
305
+ item_id: str,
306
+ item_kind: str,
307
+ phase: str | None = None,
308
+ initial: ContentSnapshot | None = None,
309
+ ) -> list[ItemStarted]:
310
+ key = (scope_id, item_id)
311
+ if key in started_items:
312
+ return []
313
+ started_items.add(key)
314
+ return [
315
+ ItemStarted(
316
+ **env_kwargs(item_id, "item.started", "item"),
317
+ item_id=item_id,
318
+ item_kind=item_kind,
319
+ phase=phase,
320
+ initial=initial,
321
+ )
322
+ ]
323
+
324
+ if run.pending_cancel:
325
+ run.done = True
326
+ yield RunCanceled(
327
+ **env_kwargs(run_item_id, "run.canceled", "run"),
328
+ status="canceled",
329
+ reason=CancelResult.PENDING_CANCEL_RECORDED.value,
330
+ )
331
+ return
332
+ yield RunStarted(
333
+ **env_kwargs(run_item_id, "run.started", "run"),
334
+ status="running",
335
+ )
336
+ run.task = asyncio.create_task(self.execute_request(run.request))
337
+ try:
338
+ result = await run.task
339
+ for call in result["tool_calls"]:
340
+ call_id = call["call_id"]
341
+ tool_item_id = stable_item_id(framework, run_id, "tool_call", call_id)
342
+ for ev in ensure_started(
343
+ item_id=tool_item_id,
344
+ item_kind="tool_call",
345
+ initial=ContentSnapshot(
346
+ parts=(
347
+ ToolCallContent(
348
+ part_id="tool-0",
349
+ call_id=call_id,
350
+ name=call["name"],
351
+ arguments=call["arguments"],
352
+ ),
353
+ )
354
+ ),
355
+ ):
356
+ yield ev
357
+ yield ItemCompleted(
358
+ **env_kwargs(tool_item_id, "item.completed", "tool-0"),
359
+ item_id=tool_item_id,
360
+ item_kind="tool_call",
361
+ snapshot=ContentSnapshot(
362
+ parts=(
363
+ ToolResultContent(
364
+ part_id="tool-0",
365
+ call_id=call_id,
366
+ result=call["result"],
367
+ ),
368
+ )
369
+ ),
370
+ )
371
+ text = str(result["output"])
372
+ for ev in ensure_started(
373
+ item_id=message_item_id,
374
+ item_kind="message",
375
+ phase="final_answer",
376
+ ):
377
+ yield ev
378
+ yield ItemUpdated(
379
+ **env_kwargs(message_item_id, "item.updated", "text-0"),
380
+ item_id=message_item_id,
381
+ item_kind="message",
382
+ op="append",
383
+ update=TextContent(part_id="text-0", text=text),
384
+ )
385
+ yield ItemCompleted(
386
+ **env_kwargs(message_item_id, "item.completed", "text-0"),
387
+ item_id=message_item_id,
388
+ item_kind="message",
389
+ snapshot=ContentSnapshot(
390
+ parts=(TextContent(part_id="text-0", text=text),)
391
+ ),
392
+ )
393
+ run.done = True
394
+ yield RunCompleted(
395
+ **env_kwargs(run_item_id, "run.completed", "run"),
396
+ status="completed",
397
+ output_refs=(
398
+ OutputRef(
399
+ scope_id=scope_id,
400
+ item_id=message_item_id,
401
+ part_id="text-0",
402
+ ),
403
+ ),
404
+ )
405
+ except asyncio.CancelledError:
406
+ run.done = True
407
+ yield RunCanceled(
408
+ **env_kwargs(run_item_id, "run.canceled", "run"),
409
+ status="canceled",
410
+ reason=CancelResult.INTERRUPTED_ACTIVE_TURN.value,
411
+ )
412
+ except Exception as exc: # noqa: BLE001
413
+ run.done = True
414
+ yield RunFailed(
415
+ **env_kwargs(run_item_id, "run.failed", "run"),
416
+ status="failed",
417
+ error=ErrorInfo(
418
+ code="harness_failed",
419
+ message=str(exc),
420
+ source=framework,
421
+ scope_id=scope_id,
422
+ ),
423
+ )
424
+
425
+ def _require_run(self, handle: RunHandle) -> _HarnessRun:
426
+ if handle.runtime_type != "harness":
427
+ raise ValueError(f"Harness adapter cannot stream {handle.runtime_type!r}")
428
+ try:
429
+ return self._runs[handle.run_id]
430
+ except KeyError:
431
+ raise KeyError(f"unknown Harness run: {handle.run_id}") from None
432
+
433
+ async def _ensure_tools(self) -> tuple[HarnessTool, ...]:
434
+ if self._tools is not None:
435
+ return self._tools
436
+ async with self._tool_lock:
437
+ if self._tools is not None:
438
+ return self._tools
439
+ tools = sandbox_tools(self._sandbox)
440
+ try:
441
+ for spec in self._config.mcp_tools:
442
+ toolset, discovered = await load_mcp_tools(spec)
443
+ self._mcp_toolsets.append(toolset)
444
+ tools.extend(discovered)
445
+ duplicates = sorted(
446
+ {
447
+ tool.name
448
+ for tool in tools
449
+ if sum(item.name == tool.name for item in tools) > 1
450
+ }
451
+ )
452
+ if duplicates:
453
+ raise RuntimeError(f"Harness tool names are not unique: {duplicates}")
454
+ except Exception:
455
+ await self._close_tools()
456
+ raise
457
+ self._tools = tuple(tools)
458
+ return self._tools
459
+
460
+ async def _close_tools(self) -> None:
461
+ toolsets, self._mcp_toolsets = self._mcp_toolsets, []
462
+ self._tools = None
463
+ if toolsets:
464
+ await asyncio.gather(*(toolset.close() for toolset in toolsets), return_exceptions=True)
465
+
466
+
467
+ __all__ = ["HarnessRuntime", "HarnessRuntimeAdapter"]
ksadk/hermes_terminal.py CHANGED
@@ -90,6 +90,7 @@ def build_start_frame(
90
90
  argv: Sequence[str],
91
91
  cols: int,
92
92
  rows: int,
93
+ session_id: str | None = None,
93
94
  cwd: str | None = None,
94
95
  options: Mapping[str, Any] | None = None,
95
96
  ) -> str:
@@ -106,6 +107,9 @@ def build_start_frame(
106
107
  normalized_cwd = str(cwd or "").strip()
107
108
  if normalized_cwd:
108
109
  payload["cwd"] = normalized_cwd
110
+ normalized_session_id = str(session_id or "").strip()
111
+ if normalized_session_id:
112
+ payload["session_id"] = normalized_session_id
109
113
  if options:
110
114
  payload["options"] = dict(options)
111
115
  return json.dumps(payload, ensure_ascii=False)
@@ -415,6 +419,7 @@ async def run_hermes_terminal_session(
415
419
  argv=normalized_argv,
416
420
  cols=size.cols,
417
421
  rows=size.rows,
422
+ session_id=session_id,
418
423
  cwd=cwd,
419
424
  options=options,
420
425
  )
@@ -305,9 +305,10 @@ def resolve_identity(
305
305
  access_keys = _call_list_all_user_access_keys(client, sdk_parts)
306
306
  user_name = _find_username_by_ak(access_keys, access_key)
307
307
  if not user_name:
308
- # AK 不在子用户列表(可能是主账号 AK),无法反查 user uuid
309
- logger.warning(
310
- "AK 指纹 %s 未在 ListAllUserAccessKeys 找到匹配(可能是主账号 AK)",
308
+ # 主账号 AK 不会出现在子用户列表,属预期路径:无子账号 uuid 可反查,
309
+ # 调用方将只注入主账号维度 header(account_id)。
310
+ logger.info(
311
+ "AK 为主账号密钥(指纹 %s),按主账号身份使用,不注入子账号 uuid",
311
312
  fingerprint,
312
313
  )
313
314
  return None
@@ -0,0 +1,28 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Durable Interaction ledger(Phase 1 Task 5,Interaction/v1)。"""
3
+
4
+ from ksadk.interaction.contracts import (
5
+ InteractionRecord,
6
+ InteractionReceipt,
7
+ InteractionSubmission,
8
+ )
9
+ from ksadk.interaction.ledger import InteractionLedger
10
+ from ksadk.interaction.provider import (
11
+ RUNTIME_INTERACTION_UNAVAILABLE,
12
+ InteractionProvider,
13
+ InteractionProviderMode,
14
+ InteractionResolveContext,
15
+ UnavailableInteractionProvider,
16
+ )
17
+
18
+ __all__ = [
19
+ "RUNTIME_INTERACTION_UNAVAILABLE",
20
+ "InteractionLedger",
21
+ "InteractionProvider",
22
+ "InteractionProviderMode",
23
+ "InteractionRecord",
24
+ "InteractionReceipt",
25
+ "InteractionResolveContext",
26
+ "InteractionSubmission",
27
+ "UnavailableInteractionProvider",
28
+ ]
@@ -0,0 +1,136 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Interaction/v1 冻结合同(对齐 contracts/agent-kernel/v1/interaction.schema.json)。
3
+
4
+ Wire 模型与 JSON Schema 一一对应;``InteractionRecord`` 是内核侧的完整
5
+ durable 行(含内部 ``provider_id`` / ``native_target`` / 不透明的
6
+ ``continuation_metadata``),对外投影(SessionEvent payload、公共 API 返回)
7
+ 必须省略这三个字段。
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from typing import Any, Literal, Union
13
+ from uuid import UUID
14
+
15
+ from pydantic import BaseModel, ConfigDict, Field, model_validator
16
+
17
+ InteractionKind = Literal["approval", "structured_input", "plan_review", "custom"]
18
+ InteractionStatus = Literal[
19
+ "pending", "resolving", "resolved", "cancelled", "expired"
20
+ ]
21
+ InteractionAction = Literal["approve", "reject", "submit", "cancel"]
22
+ InteractionOutcome = Literal[
23
+ "approved", "rejected", "submitted", "cancelled", "expired"
24
+ ]
25
+
26
+
27
+ class _StrictModel(BaseModel):
28
+ model_config = ConfigDict(extra="forbid", frozen=True)
29
+
30
+
31
+ class A2UIPresentation(_StrictModel):
32
+ wire_version: Literal["0.9.1"] = "0.9.1"
33
+ catalog_digest: str
34
+ messages: list[dict[str, Any]]
35
+
36
+
37
+ class InteractionPresentation(_StrictModel):
38
+ title: str
39
+ description: str | None = None
40
+ a2ui: A2UIPresentation | None = None
41
+
42
+
43
+ class InteractionRecord(_StrictModel):
44
+ """一条 interaction 的 durable 状态行(内部权威形态)。
45
+
46
+ 公开投影(``public_request()`` / interaction.requested 事件 payload)
47
+ 省略 ``provider_id`` / ``native_target`` / ``continuation_metadata``。
48
+ """
49
+
50
+ schema_version: Literal[1] = 1
51
+ interaction_id: str
52
+ tenant_id: str
53
+ agent_instance_id: str
54
+ session_id: str
55
+ run_id: str
56
+ kind: InteractionKind
57
+ request_schema: dict[str, Any]
58
+ revision: int = 1
59
+ status: InteractionStatus = "pending"
60
+ created_at: str
61
+ expires_at: str | None = None
62
+ presentation: InteractionPresentation | None = None
63
+ # ---- 内部字段:绝不进入公共事件 / 公共 API 投影 ----
64
+ provider_id: str = ""
65
+ native_target: dict[str, Any] | None = None
66
+ continuation_metadata: dict[str, Any] | None = None
67
+
68
+ def public_request(self) -> dict[str, Any]:
69
+ """interactionRequest 投影(schema additionalProperties=false)。"""
70
+ payload: dict[str, Any] = {
71
+ "schema_version": self.schema_version,
72
+ "interaction_id": self.interaction_id,
73
+ "tenant_id": self.tenant_id,
74
+ "agent_instance_id": self.agent_instance_id,
75
+ "session_id": self.session_id,
76
+ "run_id": self.run_id,
77
+ "kind": self.kind,
78
+ "request_schema": self.request_schema,
79
+ "revision": self.revision,
80
+ "created_at": self.created_at,
81
+ }
82
+ if self.expires_at is not None:
83
+ payload["expires_at"] = self.expires_at
84
+ if self.presentation is not None:
85
+ payload["presentation"] = self.presentation.model_dump(mode="json")
86
+ return payload
87
+
88
+
89
+ class InteractionSubmission(_StrictModel):
90
+ """用户对一条 pending interaction 的提交(submitInteractionRequest)。"""
91
+
92
+ schema_version: Literal[1] = 1
93
+ interaction_id: str
94
+ expected_revision: int
95
+ action: InteractionAction
96
+ response: Any = None
97
+ idempotency_key: str
98
+
99
+
100
+ class InteractionReceipt(_StrictModel):
101
+ schema_version: Literal[1] = 1
102
+ interaction_id: str
103
+ revision: int
104
+ status: InteractionStatus
105
+ outcome: InteractionOutcome | None = None
106
+ event_id: UUID | str | None = None
107
+ accepted_seq: int | None = None
108
+
109
+
110
+ RESOLVE_OUTCOMES: dict[str, InteractionOutcome] = {
111
+ "approve": "approved",
112
+ "reject": "rejected",
113
+ "submit": "submitted",
114
+ }
115
+
116
+ TERMINAL_STATUSES = frozenset({"resolved", "cancelled", "expired"})
117
+
118
+
119
+ def is_terminal(status: str) -> bool:
120
+ return status in TERMINAL_STATUSES
121
+
122
+
123
+ __all__ = [
124
+ "A2UIPresentation",
125
+ "InteractionAction",
126
+ "InteractionKind",
127
+ "InteractionOutcome",
128
+ "InteractionPresentation",
129
+ "InteractionRecord",
130
+ "InteractionReceipt",
131
+ "InteractionStatus",
132
+ "InteractionSubmission",
133
+ "RESOLVE_OUTCOMES",
134
+ "TERMINAL_STATUSES",
135
+ "is_terminal",
136
+ ]