agentengine-sdk-python 0.8.1__py3-none-any.whl → 0.8.3__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 (476) hide show
  1. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/METADATA +25 -12
  2. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/RECORD +421 -232
  3. ksadk/_build_provenance.json +1 -0
  4. ksadk/a2a/_space_client_events.py +381 -0
  5. ksadk/a2a/event_adapter.py +156 -64
  6. ksadk/a2a/executor.py +179 -63
  7. ksadk/a2a/space_client.py +6 -333
  8. ksadk/a2ui/core.py +222 -53
  9. ksadk/agui/_agent_helpers.py +247 -0
  10. ksadk/agui/a2ui_projection.py +12 -5
  11. ksadk/agui/agent.py +443 -259
  12. ksadk/api/client.py +528 -27
  13. ksadk/builders/code_builder.py +284 -8
  14. ksadk/builders/container_builder.py +8 -1
  15. ksadk/builders/managed_runtime_builder.py +42 -35
  16. ksadk/cli/__init__.py +23 -0
  17. ksadk/cli/cmd_dashboard.py +15 -1
  18. ksadk/cli/cmd_deploy.py +10 -2
  19. ksadk/cli/cmd_eval.py +66 -9
  20. ksadk/cli/cmd_evalset.py +284 -0
  21. ksadk/cli/cmd_files.py +5 -1
  22. ksadk/cli/cmd_hermes.py +1 -126
  23. ksadk/cli/cmd_invoke.py +28 -38
  24. ksadk/cli/cmd_managed_runtime.py +95 -0
  25. ksadk/cli/cmd_observe.py +85 -0
  26. ksadk/cli/cmd_openclaw.py +1 -435
  27. ksadk/cli/cmd_plugin.py +657 -0
  28. ksadk/cli/cmd_replay.py +28 -4
  29. ksadk/cli/cmd_studio.py +99 -8
  30. ksadk/cli/cmd_web.py +10 -2
  31. ksadk/cli/hermes_env.py +151 -0
  32. ksadk/cli/invoke_payload.py +49 -0
  33. ksadk/cli/openclaw_env.py +458 -0
  34. ksadk/codex/client.py +180 -30
  35. ksadk/codex/runtime.py +475 -331
  36. ksadk/configs/env_registry.py +94 -12
  37. ksadk/configs/env_registry_pcm.py +181 -0
  38. ksadk/configs/env_var_spec.py +18 -0
  39. ksadk/configs/global_config.py +5 -0
  40. ksadk/configs/settings.py +9 -0
  41. ksadk/context_engine/__init__.py +98 -0
  42. ksadk/context_engine/assembler.py +176 -0
  43. ksadk/context_engine/baseline.py +419 -0
  44. ksadk/context_engine/cache_observability.py +228 -0
  45. ksadk/context_engine/capabilities.py +443 -0
  46. ksadk/context_engine/contributors.py +409 -0
  47. ksadk/context_engine/hosted_pipeline.py +417 -0
  48. ksadk/context_engine/models.py +117 -0
  49. ksadk/context_engine/planner.py +698 -0
  50. ksadk/context_engine/policies.py +319 -0
  51. ksadk/context_engine/projection.py +31 -0
  52. ksadk/context_engine/shadow_plan.py +266 -0
  53. ksadk/context_engine/tokenizer.py +164 -0
  54. ksadk/conversations/__init__.py +19 -0
  55. ksadk/conversations/context.py +230 -30
  56. ksadk/conversations/contracts.py +266 -0
  57. ksadk/conversations/message_projection.py +308 -26
  58. ksadk/conversations/model_context.py +49 -3
  59. ksadk/conversations/projector.py +616 -0
  60. ksadk/conversations/reducer.py +98 -0
  61. ksadk/conversations/runtime_compaction.py +207 -5
  62. ksadk/conversations/runtime_input.py +184 -2
  63. ksadk/conversations/runtime_invocation.py +81 -3
  64. ksadk/conversations/runtime_observability.py +141 -0
  65. ksadk/conversations/runtime_payloads.py +42 -0
  66. ksadk/conversations/runtime_preparation.py +272 -2
  67. ksadk/conversations/runtime_resume.py +20 -1
  68. ksadk/conversations/runtime_stream_events.py +94 -9
  69. ksadk/conversations/semantic_summary.py +311 -1
  70. ksadk/conversations/session_lock.py +51 -0
  71. ksadk/deployment/env_forward.py +72 -0
  72. ksadk/deployment/managed_runtime.py +5 -0
  73. ksadk/deployment/providers/serverless.py +143 -69
  74. ksadk/evaluation/__init__.py +32 -0
  75. ksadk/evaluation/a2a_adapter.py +9 -1
  76. ksadk/evaluation/adapters.py +18 -5
  77. ksadk/evaluation/agent_eval_client.py +395 -0
  78. ksadk/evaluation/cloud_binding.py +80 -0
  79. ksadk/evaluation/cloud_converter.py +194 -0
  80. ksadk/evaluation/cloud_service.py +199 -0
  81. ksadk/evaluation/contracts.py +73 -4
  82. ksadk/evaluation/evaluators.py +183 -17
  83. ksadk/evaluation/evidence.py +258 -0
  84. ksadk/evaluation/executor.py +31 -6
  85. ksadk/evaluation/local_adapter.py +550 -0
  86. ksadk/evaluation/service_env.py +27 -0
  87. ksadk/evaluation/studio_build_adapter.py +253 -0
  88. ksadk/evaluation/target.py +15 -6
  89. ksadk/events/__init__.py +13 -13
  90. ksadk/events/_v1_compat/__init__.py +1 -0
  91. ksadk/events/_v1_compat/models.py +299 -0
  92. ksadk/events/_v1_compat/parser.py +247 -0
  93. ksadk/events/_v1_compat/projection.py +755 -0
  94. ksadk/events/adapters/__init__.py +34 -0
  95. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  96. ksadk/events/adapters/_a2a_support.py +275 -0
  97. ksadk/events/adapters/_codex_interactions.py +375 -0
  98. ksadk/events/adapters/_codex_items.py +801 -0
  99. ksadk/events/adapters/_codex_validators.py +311 -0
  100. ksadk/events/adapters/_langgraph_support.py +785 -0
  101. ksadk/events/adapters/a2a.py +841 -0
  102. ksadk/events/adapters/adk.py +503 -0
  103. ksadk/events/adapters/codex.py +907 -0
  104. ksadk/events/adapters/langgraph.py +745 -0
  105. ksadk/events/canonical.py +440 -0
  106. ksadk/events/canonical_replay.py +497 -0
  107. ksadk/events/canonical_store.py +468 -0
  108. ksadk/events/cold_recovery.py +257 -0
  109. ksadk/events/content.py +89 -0
  110. ksadk/events/identity.py +86 -0
  111. ksadk/events/pipeline.py +455 -0
  112. ksadk/events/projections.py +66 -0
  113. ksadk/events/reducer.py +661 -0
  114. ksadk/events/replay.py +3 -36
  115. ksadk/events/runtime_event.py +20 -265
  116. ksadk/events/session_event.py +324 -0
  117. ksadk/events/store.py +3 -316
  118. ksadk/events/v1_compat.py +41 -0
  119. ksadk/harness/__init__.py +45 -35
  120. ksadk/harness/runtime.py +220 -58
  121. ksadk/identity/resolver.py +4 -3
  122. ksadk/interaction/__init__.py +28 -0
  123. ksadk/interaction/contracts.py +136 -0
  124. ksadk/interaction/ledger.py +189 -0
  125. ksadk/interaction/provider.py +122 -0
  126. ksadk/interaction/providers/__init__.py +52 -0
  127. ksadk/interaction/providers/adk.py +40 -0
  128. ksadk/interaction/providers/codex.py +94 -0
  129. ksadk/interaction/providers/langgraph.py +58 -0
  130. ksadk/kernel/__init__.py +117 -0
  131. ksadk/kernel/authorization.py +258 -0
  132. ksadk/kernel/bootstrap.py +1074 -0
  133. ksadk/kernel/contract_fingerprints.py +62 -0
  134. ksadk/kernel/contracts.py +370 -0
  135. ksadk/kernel/control.py +220 -0
  136. ksadk/kernel/errors.py +79 -0
  137. ksadk/kernel/ingress.py +1123 -0
  138. ksadk/kernel/mapping.py +111 -0
  139. ksadk/kernel/memory_store.py +1134 -0
  140. ksadk/kernel/postgres_store.py +1757 -0
  141. ksadk/kernel/recovery.py +452 -0
  142. ksadk/kernel/runtime_identity.py +103 -0
  143. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  144. ksadk/kernel/sqlite_store.py +1411 -0
  145. ksadk/kernel/state.py +145 -0
  146. ksadk/kernel/store.py +232 -0
  147. ksadk/kernel/worker.py +964 -0
  148. ksadk/knowledge_base/client.py +7 -0
  149. ksadk/knowledge_base/service.py +32 -5
  150. ksadk/memory/__init__.py +61 -0
  151. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  152. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  153. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  154. ksadk/memory/adk/backends/sdk_ltm_backend.py +384 -2
  155. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  156. ksadk/memory/coordinator.py +461 -0
  157. ksadk/memory/events.py +202 -0
  158. ksadk/memory/extraction.py +228 -0
  159. ksadk/memory/ltm_backend_factory.py +16 -3
  160. ksadk/memory/models.py +316 -0
  161. ksadk/memory/policy.py +215 -0
  162. ksadk/memory/provider.py +47 -0
  163. ksadk/memory/provider_adapter.py +159 -0
  164. ksadk/memory/provider_resolver.py +71 -0
  165. ksadk/memory/providers/__init__.py +5 -0
  166. ksadk/memory/providers/local_sqlite.py +497 -0
  167. ksadk/memory/resolved_policy.py +145 -0
  168. ksadk/memory/service.py +188 -6
  169. ksadk/model_proxy/bootstrap.py +16 -9
  170. ksadk/model_proxy/detect.py +202 -9
  171. ksadk/model_proxy/namespace.py +39 -15
  172. ksadk/model_proxy/server.py +24 -5
  173. ksadk/model_proxy/transform.py +60 -2
  174. ksadk/observability/__init__.py +25 -0
  175. ksadk/observability/session_log.py +420 -0
  176. ksadk/observability/trajectory.py +105 -0
  177. ksadk/plugins/__init__.py +167 -0
  178. ksadk/plugins/bridges/__init__.py +45 -0
  179. ksadk/plugins/bridges/codex.py +552 -0
  180. ksadk/plugins/bridges/dsh.py +1116 -0
  181. ksadk/plugins/builtins.py +747 -0
  182. ksadk/plugins/bundle.py +246 -0
  183. ksadk/plugins/bundle_security.py +167 -0
  184. ksadk/plugins/composition.py +529 -0
  185. ksadk/plugins/context_contributor.py +437 -0
  186. ksadk/plugins/contracts.py +451 -0
  187. ksadk/plugins/dsh_toolchain.py +935 -0
  188. ksadk/plugins/ecosystem_bridge.py +1105 -0
  189. ksadk/plugins/ecosystem_probe.py +191 -0
  190. ksadk/plugins/host.py +724 -0
  191. ksadk/plugins/providers/__init__.py +85 -0
  192. ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
  193. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
  194. ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
  195. ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
  196. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
  197. ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
  198. ksadk/plugins/providers/codex.py +722 -0
  199. ksadk/plugins/providers/codex_dsh.py +83 -0
  200. ksadk/plugins/providers/dsh.py +951 -0
  201. ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
  202. ksadk/plugins/providers/harness.py +627 -0
  203. ksadk/plugins/providers/harness_dsh.py +91 -0
  204. ksadk/plugins/providers/legacy.py +215 -0
  205. ksadk/plugins/providers/legacy_catalog.py +100 -0
  206. ksadk/plugins/providers/shipped_dsh.py +370 -0
  207. ksadk/plugins/resolver.py +331 -0
  208. ksadk/plugins/subagent_providers/__init__.py +12 -0
  209. ksadk/plugins/subagent_providers/codex.py +443 -0
  210. ksadk/plugins/subagents.py +333 -0
  211. ksadk/prompts/__init__.py +71 -0
  212. ksadk/prompts/compiler.py +215 -0
  213. ksadk/prompts/models.py +82 -0
  214. ksadk/prompts/projection.py +89 -0
  215. ksadk/prompts/resolved.py +137 -0
  216. ksadk/prompts/sources.py +233 -0
  217. ksadk/runners/_langgraph_runner_streams.py +822 -0
  218. ksadk/runners/adk_runner.py +5 -5
  219. ksadk/runners/base_runner.py +16 -0
  220. ksadk/runners/factory.py +1 -2
  221. ksadk/runners/langgraph_runner.py +198 -437
  222. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  223. ksadk/runtime/_runner_adapter/stream_mapping.py +797 -0
  224. ksadk/runtime/adapter.py +119 -2
  225. ksadk/runtime/conversation_execution.py +316 -182
  226. ksadk/runtime/executor.py +144 -3
  227. ksadk/runtime/factory.py +268 -8
  228. ksadk/runtime/framework_adapters.py +18 -0
  229. ksadk/runtime/hosted_finalizer.py +268 -0
  230. ksadk/runtime/launch.py +14 -1
  231. ksadk/runtime/preprocessing.py +25 -3
  232. ksadk/runtime/runner_adapter.py +293 -508
  233. ksadk/runtime/usage.py +33 -0
  234. ksadk/sandbox/__init__.py +2 -1
  235. ksadk/sandbox/backends/e2b.py +35 -2
  236. ksadk/sandbox/factory.py +72 -0
  237. ksadk/scheduler/__init__.py +18 -0
  238. ksadk/scheduler/calendar.py +102 -0
  239. ksadk/scheduler/contracts.py +254 -0
  240. ksadk/scheduler/dispatcher.py +129 -0
  241. ksadk/scheduler/engine.py +416 -0
  242. ksadk/scheduler/sqlite_store.py +563 -0
  243. ksadk/server/composition.py +8 -0
  244. ksadk/server/factory.py +69 -6
  245. ksadk/server/routes/kernel_ingress.py +258 -0
  246. ksadk/server/routes/openai_compat.py +88 -8
  247. ksadk/server/routes/projection.py +35 -20
  248. ksadk/server/routes/run.py +94 -0
  249. ksadk/server/routes/sessions.py +2 -0
  250. ksadk/server/routes/streaming.py +5 -2
  251. ksadk/server/static/assets/{ArtifactsPanel-CakCqxEN.js → ArtifactsPanel-10GPXIJ6.js} +1 -1
  252. ksadk/server/static/assets/{CodeBlock-CynLknyO.js → CodeBlock-BXk1l-G1.js} +4 -4
  253. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  254. ksadk/server/static/assets/{MathMessageMarkdown-3sQdOysS.js → MathMessageMarkdown-D9uB55Oh.js} +4 -4
  255. ksadk/server/static/assets/MermaidBlock--OEYoXIJ.js +312 -0
  256. ksadk/server/static/assets/NativeTerminalPanel-DrEe1syq.js +1 -0
  257. ksadk/server/static/assets/abnfDiagram-VCTEODGH-eeTFJLvo.js +1 -0
  258. ksadk/server/static/assets/arc-S3ZNbIAd.js +1 -0
  259. ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +1 -0
  260. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-CRjgEJDX.js +36 -0
  261. ksadk/server/static/assets/blockDiagram-NRAW4CY4-C7bsBoNH.js +129 -0
  262. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-BX3c33Ob.js +38 -0
  263. ksadk/server/static/assets/channel-s354Yo6o.js +1 -0
  264. ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +1 -0
  265. ksadk/server/static/assets/{chunk-FMBD7UC4-B_fH2YuH.js → chunk-5VM5RSS4-bZ7ws-8m.js} +1 -1
  266. ksadk/server/static/assets/{chunk-ND2GUHAM-D6rFLaVV.js → chunk-F27PBJKO-D2r0pvhY.js} +1 -1
  267. ksadk/server/static/assets/chunk-G27WJ6UU-CZwF3oUP.js +231 -0
  268. ksadk/server/static/assets/{chunk-4BX2VUAB-B9drTgOW.js → chunk-JWPE2WC7-DigFYCML.js} +1 -1
  269. ksadk/server/static/assets/chunk-LCL6LL3I-CnorGV5q.js +206 -0
  270. ksadk/server/static/assets/chunk-POPQ4Y6H-CexntQA-.js +1 -0
  271. ksadk/server/static/assets/chunk-RHFEMEQ7-CHTC7UxA.js +168 -0
  272. ksadk/server/static/assets/chunk-SVP7TREG-BC1EWt_-.js +88 -0
  273. ksadk/server/static/assets/chunk-XXDRQBXY-BTG24xN0.js +1 -0
  274. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +1 -0
  275. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +1 -0
  276. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-ChNs_Mdk.js → cose-bilkent-JH36ORCC-CkonRdAS.js} +1 -1
  277. ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +1 -0
  278. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-DEOCBe15.js +62 -0
  279. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  280. ksadk/server/static/assets/dagre-3AP2YEHR-DBThPuLa.js +4 -0
  281. ksadk/server/static/assets/dagre-ClTPrTht.js +1 -0
  282. ksadk/server/static/assets/diagram-S7CK7UJ4-DsZHrnpJ.js +30 -0
  283. ksadk/server/static/assets/diagram-UQ7AKVKN-BJR4nhVr.js +41 -0
  284. ksadk/server/static/assets/diagram-VSXAHHWV-xzcERX0a.js +3 -0
  285. ksadk/server/static/assets/diagram-VX7I27RA-tn2xM1xu.js +24 -0
  286. ksadk/server/static/assets/diagram-Z3DM3KII-BZPGBkw5.js +24 -0
  287. ksadk/server/static/assets/{dist-gLnrGsoU.js → dist-4zN1_tq5.js} +1 -1
  288. ksadk/server/static/assets/{dist-C1sz5Eo3.js → dist-8VWI-2bZ.js} +1 -1
  289. ksadk/server/static/assets/{dist-BjOdlDjj.js → dist-B-46q3Hk.js} +1 -1
  290. ksadk/server/static/assets/{dist-o2OVmKvt.js → dist-B0gdk4rl.js} +1 -1
  291. ksadk/server/static/assets/{dist-4N2NMVYg.js → dist-B1oWRmrH.js} +1 -1
  292. ksadk/server/static/assets/{dist-CmZHzlwZ.js → dist-BI1qQH4n.js} +1 -1
  293. ksadk/server/static/assets/{dist-X4TnqwOK.js → dist-BJLUwH6W.js} +1 -1
  294. ksadk/server/static/assets/{dist-B5oS1zcj.js → dist-Bbwqa8TG.js} +1 -1
  295. ksadk/server/static/assets/{dist-j6Dxmf_j.js → dist-Btyo4vX4.js} +1 -1
  296. ksadk/server/static/assets/{dist-DQU9EWw-.js → dist-C71CsujO.js} +1 -1
  297. ksadk/server/static/assets/{dist-BIlKoW0k.js → dist-CXpH_Rdd.js} +1 -1
  298. ksadk/server/static/assets/{dist-DJN_6Y39.js → dist-Cq4OL6nO.js} +1 -1
  299. ksadk/server/static/assets/{dist-Dli7qW-B.js → dist-D1V3f1B4.js} +1 -1
  300. ksadk/server/static/assets/{dist-fhOuWds5.js → dist-DJmCPRVB.js} +1 -1
  301. ksadk/server/static/assets/{dist-CWV4lDr1.js → dist-DQAB0qn_.js} +2 -2
  302. ksadk/server/static/assets/{dist-D6MpCZtz.js → dist-DUwKa_l6.js} +1 -1
  303. ksadk/server/static/assets/dist-DdRBIceA.js +1 -0
  304. ksadk/server/static/assets/{dist-DWKByxWV.js → dist-DfGFrb0v.js} +1 -1
  305. ksadk/server/static/assets/{dist-DsHPdk3W.js → dist-DjhwGUgZ.js} +1 -1
  306. ksadk/server/static/assets/{dist-B-jNR6Vn.js → dist-DyqV4fL4.js} +1 -1
  307. ksadk/server/static/assets/{dist-BB3-OwTQ.js → dist-M67Hwu0n.js} +1 -1
  308. ksadk/server/static/assets/{dist-_pHPTyZ-.js → dist-u8tVH5Ak.js} +1 -1
  309. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-DVfMsLge.js +1 -0
  310. ksadk/server/static/assets/erDiagram-SSCWMZ5O-CWEZSYaw.js +99 -0
  311. ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +1 -0
  312. ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +1 -0
  313. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-TWIxoyYL.js +292 -0
  314. ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +1 -0
  315. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-DDh2hd2S.js +106 -0
  316. ksadk/server/static/assets/index-B2k_urY8.js +241 -0
  317. ksadk/server/static/assets/index-ILPt6IWF.css +2 -0
  318. ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +1 -0
  319. ksadk/server/static/assets/infoDiagram-RXCK75RN-CgoyWiDR.js +2 -0
  320. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-K0OOfVna.js → ishikawaDiagram-5VMMS53U-CyRIu_om.js} +6 -6
  321. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-8LeOJaZp.js → journeyDiagram-EYS64GPL-DN5JXHzN.js} +6 -6
  322. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-C6uCgZrW.js → kanban-definition-3QL26DDD-CNP3ui66.js} +10 -10
  323. ksadk/server/static/assets/katex-DWEzQy1d.js +257 -0
  324. ksadk/server/static/assets/{linear-hdBcYzM8.js → linear-C-qHp7d2.js} +1 -1
  325. ksadk/server/static/assets/mermaid-parser.core-Cl-K943T.js +166 -0
  326. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-Bjy_2v4_.js → mindmap-definition-FBJOCRG2-D5DB5mYm.js} +29 -29
  327. ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +1 -0
  328. ksadk/server/static/assets/pegDiagram-XKGWAZYB-BQVc9ia_.js +1 -0
  329. ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +1 -0
  330. ksadk/server/static/assets/pieDiagram-E7YTZNPT-B6UCAvtY.js +39 -0
  331. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-BmkRbwCg.js → quadrantDiagram-AXDQQJYC-mIr2d3eb.js} +6 -6
  332. ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +1 -0
  333. ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +1 -0
  334. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +1 -0
  335. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +1 -0
  336. ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +1 -0
  337. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-Dt3FFDmK.js +1 -0
  338. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-Cz_vQtgF.js +84 -0
  339. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-l6iXmU65.js → sankeyDiagram-P5KCCOFB-wlO1TsH5.js} +7 -7
  340. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-Cq6UBeQB.js → sequenceDiagram-WJ2MYXX4-CHRbElYq.js} +10 -10
  341. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-DXX54iyO.js +1 -0
  342. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-Dp_lw9II.js +1 -0
  343. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +1 -0
  344. ksadk/server/static/assets/swimlanes-XN3QIQJK-D8O5UlLG.js +1 -0
  345. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +8 -0
  346. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-DEz24vV0.js → timeline-definition-24CTP7MA-8mfKcxvG.js} +7 -7
  347. ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +1 -0
  348. ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +1 -0
  349. ksadk/server/static/assets/vennDiagram-4TSXK5OY-EnNl0DE7.js +34 -0
  350. ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +1 -0
  351. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DBu5fbYr.js +78 -0
  352. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-BSVXs4IY.js +7 -0
  353. ksadk/server/static/index.html +2 -2
  354. ksadk/sessions/__init__.py +26 -9
  355. ksadk/sessions/_local_service_sync.py +688 -0
  356. ksadk/sessions/_local_tables.py +21 -0
  357. ksadk/sessions/_postgres_schema.py +305 -0
  358. ksadk/sessions/_postgres_tables.py +15 -0
  359. ksadk/sessions/base.py +80 -1
  360. ksadk/sessions/in_memory.py +53 -2
  361. ksadk/sessions/local_service.py +63 -604
  362. ksadk/sessions/postgres_service.py +58 -148
  363. ksadk/sessions/resilient.py +35 -1
  364. ksadk/skills/service_client.py +48 -0
  365. ksadk/studio/agent_lifecycle.py +26 -20
  366. ksadk/studio/api.py +1063 -69
  367. ksadk/studio/api_catalog_routes.py +5 -0
  368. ksadk/studio/api_contracts.py +148 -6
  369. ksadk/studio/api_memory_routes.py +82 -0
  370. ksadk/studio/api_plugin_routes.py +480 -0
  371. ksadk/studio/attachment_store.py +187 -0
  372. ksadk/studio/authoring.py +259 -28
  373. ksadk/studio/authoring_coordinator.py +809 -67
  374. ksadk/studio/builder.py +197 -40
  375. ksadk/studio/capabilities.py +17 -0
  376. ksadk/studio/cloud.py +1920 -95
  377. ksadk/studio/codex_agent_service.py +137 -15
  378. ksadk/studio/codex_authoring.py +469 -0
  379. ksadk/studio/codex_builder.py +177 -25
  380. ksadk/studio/codex_manifest.py +71 -22
  381. ksadk/studio/codex_run.py +59 -4
  382. ksadk/studio/compatibility_report.py +445 -0
  383. ksadk/studio/compiler.py +7 -1
  384. ksadk/studio/contracts.py +234 -4
  385. ksadk/studio/dsh_provider_registration.py +768 -0
  386. ksadk/studio/event_store.py +79 -101
  387. ksadk/studio/framework_run.py +264 -3
  388. ksadk/studio/hosted_kernel.py +317 -0
  389. ksadk/studio/manifest_resolver.py +131 -0
  390. ksadk/studio/model_client.py +95 -9
  391. ksadk/studio/model_profile_service.py +1 -1
  392. ksadk/studio/operations.py +47 -5
  393. ksadk/studio/otel_trace.py +348 -42
  394. ksadk/studio/pcm_memory.py +85 -0
  395. ksadk/studio/plugin_composition.py +301 -0
  396. ksadk/studio/plugin_kernel_adapter.py +128 -0
  397. ksadk/studio/plugin_runtime.py +652 -0
  398. ksadk/studio/repository.py +23 -2
  399. ksadk/studio/resource_catalog.py +49 -1
  400. ksadk/studio/run_service.py +1266 -202
  401. ksadk/studio/runtime_source.py +51 -17
  402. ksadk/studio/scheduler_runtime.py +374 -0
  403. ksadk/studio/scheduler_service.py +211 -0
  404. ksadk/studio/service.py +1815 -117
  405. ksadk/studio/shared_web.py +199 -50
  406. ksadk/studio/soul.py +52 -0
  407. ksadk/studio/static/assets/index-DXs1Eq4M.css +1 -0
  408. ksadk/studio/static/assets/index-DeDqwTsD.js +283 -0
  409. ksadk/studio/static/index.html +2 -2
  410. ksadk/studio/templates.py +100 -8
  411. ksadk/studio/validator.py +20 -1
  412. ksadk/studio/workspace.py +31 -32
  413. ksadk/tracing/setup.py +304 -3
  414. ksadk/version.py +1 -1
  415. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  416. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  417. ksadk_runtime_common/workspace_files/path_utils.py +41 -0
  418. ksadk/events/parser.py +0 -191
  419. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  420. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +0 -303
  421. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +0 -1
  422. ksadk/server/static/assets/arc-DrgjcKhl.js +0 -1
  423. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +0 -1
  424. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-BXoVRbQ6.js +0 -36
  425. ksadk/server/static/assets/blockDiagram-GPEHLZMM-BnaB3Ywv.js +0 -132
  426. ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dw4weZcp.js +0 -10
  427. ksadk/server/static/assets/channel-Dt3rQTFI.js +0 -1
  428. ksadk/server/static/assets/chunk-2J33WTMH-ChjpLK7j.js +0 -1
  429. ksadk/server/static/assets/chunk-55IACEB6-CK4ROATy.js +0 -1
  430. ksadk/server/static/assets/chunk-727SXJPM-B9KtTTgw.js +0 -206
  431. ksadk/server/static/assets/chunk-AQP2D5EJ-1O1mki3m.js +0 -231
  432. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +0 -1
  433. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +0 -1
  434. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +0 -1
  435. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  436. ksadk/server/static/assets/dagre-BM42HDAG-D0QXg_MQ.js +0 -4
  437. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  438. ksadk/server/static/assets/diagram-2AECGRRQ-DBDDKwBQ.js +0 -43
  439. ksadk/server/static/assets/diagram-5GNKFQAL-BkwDOxmO.js +0 -10
  440. ksadk/server/static/assets/diagram-KO2AKTUF-Bv8waYvY.js +0 -3
  441. ksadk/server/static/assets/diagram-LMA3HP47-e1VECDdu.js +0 -24
  442. ksadk/server/static/assets/diagram-OG6HWLK6-Ds9adfRl.js +0 -24
  443. ksadk/server/static/assets/dist-B5J2uhNk.js +0 -1
  444. ksadk/server/static/assets/erDiagram-TEJ5UH35-BPItFKH6.js +0 -85
  445. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +0 -1
  446. ksadk/server/static/assets/flowDiagram-I6XJVG4X-BbYB9w5Y.js +0 -162
  447. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-TQXa0KXv.js +0 -292
  448. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +0 -1
  449. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-bKblCnpa.js +0 -106
  450. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  451. ksadk/server/static/assets/index-R52pJJvg.js +0 -177
  452. ksadk/server/static/assets/index-jJr3_955.css +0 -2
  453. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +0 -1
  454. ksadk/server/static/assets/infoDiagram-5YYISTIA-BGVT7J_i.js +0 -2
  455. ksadk/server/static/assets/katex-CYWseY5E.js +0 -265
  456. ksadk/server/static/assets/mermaid-parser.core-BWrDjSZM.js +0 -161
  457. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +0 -1
  458. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +0 -1
  459. ksadk/server/static/assets/pieDiagram-4H26LBE5-GmmqNiVH.js +0 -30
  460. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +0 -1
  461. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DSWFqL7c.js +0 -84
  462. ksadk/server/static/assets/stateDiagram-AJRCARHV-qzTQpg3Y.js +0 -1
  463. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +0 -1
  464. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +0 -1
  465. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +0 -1
  466. ksadk/server/static/assets/vennDiagram-CIIHVFJN-CMCixki2.js +0 -34
  467. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +0 -1
  468. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-CVzB8F9K.js +0 -78
  469. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-BFBqBLc1.js +0 -7
  470. ksadk/studio/evaluation.py +0 -192
  471. ksadk/studio/static/assets/index-CaEN0eTR.css +0 -1
  472. ksadk/studio/static/assets/index-DI2eY_NH.js +0 -252
  473. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/WHEEL +0 -0
  474. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/entry_points.txt +0 -0
  475. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/licenses/LICENSE +0 -0
  476. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/top_level.txt +0 -0
ksadk/harness/runtime.py CHANGED
@@ -4,12 +4,35 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  import json
7
+ import time
7
8
  import uuid
8
9
  from dataclasses import dataclass
9
10
  from pathlib import Path
10
11
  from typing import Any
11
12
 
12
- from ksadk.events import EventPhase, EventType, RuntimeEvent
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
+ )
13
36
  from ksadk.harness.config import HarnessConfig
14
37
  from ksadk.harness.reasoner import HarnessReasoner, LiteLLMHarnessReasoner
15
38
  from ksadk.harness.sandbox import HarnessSandboxExecutor
@@ -49,6 +72,19 @@ class _HarnessRun:
49
72
  done: bool = False
50
73
 
51
74
 
75
+ @dataclass
76
+ class _HarnessSession:
77
+ """Process-local transcript and serialization boundary for one Session.
78
+
79
+ The public capability matrix deliberately advertises process-scoped,
80
+ non-durable continuity. Keeping this state on the adapter makes that
81
+ declaration true without pretending that a restart can recover it.
82
+ """
83
+
84
+ messages: list[dict[str, Any]]
85
+ lock: asyncio.Lock
86
+
87
+
52
88
  class HarnessRuntimeAdapter(RuntimeAdapter):
53
89
  """Execute a YAML Harness config directly as RuntimeEvent streams."""
54
90
 
@@ -72,6 +108,7 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
72
108
  self._tools: tuple[HarnessTool, ...] | None = None
73
109
  self._tool_lock = asyncio.Lock()
74
110
  self._mcp_toolsets: list[Any] = []
111
+ self._sessions: dict[tuple[str, str, str], _HarnessSession] = {}
75
112
 
76
113
  @property
77
114
  def harness_config(self) -> HarnessConfig:
@@ -144,16 +181,43 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
144
181
  if not self._runs:
145
182
  await self._close_tools()
146
183
 
184
+ async def close_all(self) -> None:
185
+ """Dispose every process-local run owned by this adapter instance."""
186
+
187
+ for run_id, run in list(self._runs.items()):
188
+ await self.close(
189
+ RunHandle(
190
+ run_id=run_id,
191
+ session_id=run.request.session_id,
192
+ runtime_type="harness",
193
+ native_ref={
194
+ "user_id": run.request.user_id,
195
+ "agent_id": run.request.agent_id,
196
+ },
197
+ )
198
+ )
199
+
147
200
  def is_handle_attached(self, handle: RunHandle) -> bool:
148
201
  return handle.run_id in self._runs
149
202
 
150
203
  async def execute_request(self, request: StartRequest) -> dict[str, Any]:
204
+ session = self._session_for(request)
205
+ async with session.lock:
206
+ return await self._execute_session_request(request, session)
207
+
208
+ async def _execute_session_request(
209
+ self,
210
+ request: StartRequest,
211
+ session: _HarnessSession,
212
+ ) -> dict[str, Any]:
151
213
  tools = await self._ensure_tools()
152
214
  model, prompt = self._effective(request)
153
215
  messages: list[dict[str, Any]] = [
154
216
  {"role": "system", "content": prompt},
155
- {"role": "user", "content": str(request.input or "")},
217
+ *[dict(message) for message in session.messages],
156
218
  ]
219
+ user_message = {"role": "user", "content": str(request.input or "")}
220
+ messages.append(user_message)
157
221
  execution_log: list[dict[str, Any]] = []
158
222
 
159
223
  for _turn_number in range(_MAX_REASONING_TURNS):
@@ -212,6 +276,12 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
212
276
  raise RuntimeError(
213
277
  "Harness reasoner returned neither a final response nor a tool call"
214
278
  )
279
+ final_message = {"role": "assistant", "content": turn.final_text}
280
+ messages.append(final_message)
281
+ # Failed or cancelled turns never commit a partial transcript.
282
+ # A successful turn atomically replaces the process-local history
283
+ # while the per-session lock is still held.
284
+ session.messages[:] = [dict(message) for message in messages[1:]]
215
285
  return {
216
286
  "output": turn.final_text,
217
287
  "model": model,
@@ -221,6 +291,18 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
221
291
  }
222
292
  raise RuntimeError(f"Harness reasoning exceeded {_MAX_REASONING_TURNS} turns")
223
293
 
294
+ def _session_for(self, request: StartRequest) -> _HarnessSession:
295
+ key = (
296
+ str(request.agent_id or self._agent_name),
297
+ str(request.user_id),
298
+ str(request.session_id),
299
+ )
300
+ session = self._sessions.get(key)
301
+ if session is None:
302
+ session = _HarnessSession(messages=[], lock=asyncio.Lock())
303
+ self._sessions[key] = session
304
+ return session
305
+
224
306
  def _effective(self, request: StartRequest) -> tuple[str, str]:
225
307
  metadata = request.metadata or {}
226
308
  model = str(
@@ -237,86 +319,166 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
237
319
 
238
320
  async def _stream(self, handle: RunHandle):
239
321
  run = self._require_run(handle)
322
+ framework = "ksadk"
323
+ run_id = handle.run_id
324
+ scope_id = stable_scope_id(framework, run_id)
325
+ message_item_id = stable_item_id(framework, run_id, "message", "final_answer")
326
+ run_item_id = stable_item_id(framework, run_id, "$run")
240
327
  seq = 0
328
+ started_items: set[tuple[str, str]] = set()
241
329
 
242
- def event(
243
- event_type: str,
244
- payload: dict[str, Any],
245
- *,
246
- phase: str | None = None,
247
- ) -> RuntimeEvent:
330
+ def next_seq() -> int:
248
331
  nonlocal seq
249
332
  seq += 1
250
- request = run.request
251
- return RuntimeEvent.create(
252
- event_type,
253
- agent_id=str(request.agent_id or self._agent_name),
254
- user_id=request.user_id,
255
- session_id=request.session_id,
256
- invocation_id=handle.run_id,
257
- seq_id=seq,
258
- payload=payload,
259
- phase=phase,
333
+ return seq
334
+
335
+ def make_source() -> SourceRef:
336
+ return SourceRef(
337
+ framework=framework,
338
+ native_run_id=run_id,
339
+ metadata={
340
+ "agent_id": str(run.request.agent_id or self._agent_name),
341
+ "user_id": run.request.user_id,
342
+ "session_id": run.request.session_id,
343
+ "invocation_id": run_id,
344
+ },
260
345
  )
261
346
 
347
+ def env_kwargs(
348
+ item_id: str, event_type: str, part_id: str
349
+ ) -> dict[str, Any]:
350
+ n = next_seq()
351
+ return {
352
+ "schema_version": 2,
353
+ "event_id": stable_event_id(
354
+ framework, scope_id, item_id, event_type, part_id, run_id, n
355
+ ),
356
+ "seq": n,
357
+ "timestamp": time.time(),
358
+ "run_id": run_id,
359
+ "scope_id": scope_id,
360
+ "source": make_source(),
361
+ }
362
+
363
+ def ensure_started(
364
+ item_id: str,
365
+ item_kind: str,
366
+ phase: str | None = None,
367
+ initial: ContentSnapshot | None = None,
368
+ ) -> list[ItemStarted]:
369
+ key = (scope_id, item_id)
370
+ if key in started_items:
371
+ return []
372
+ started_items.add(key)
373
+ return [
374
+ ItemStarted(
375
+ **env_kwargs(item_id, "item.started", "item"),
376
+ item_id=item_id,
377
+ item_kind=item_kind,
378
+ phase=phase,
379
+ initial=initial,
380
+ )
381
+ ]
382
+
262
383
  if run.pending_cancel:
263
384
  run.done = True
264
- yield event(
265
- EventType.RUN_CANCELED,
266
- {
267
- "status": "cancelled",
268
- "cancel_result": CancelResult.PENDING_CANCEL_RECORDED.value,
269
- },
385
+ yield RunCanceled(
386
+ **env_kwargs(run_item_id, "run.canceled", "run"),
387
+ status="canceled",
388
+ reason=CancelResult.PENDING_CANCEL_RECORDED.value,
270
389
  )
271
390
  return
272
- yield event(EventType.RUN_STARTED, {"status": "in_progress"})
391
+ yield RunStarted(
392
+ **env_kwargs(run_item_id, "run.started", "run"),
393
+ status="running",
394
+ )
273
395
  run.task = asyncio.create_task(self.execute_request(run.request))
274
396
  try:
275
397
  result = await run.task
276
398
  for call in result["tool_calls"]:
277
- yield event(
278
- EventType.TOOL_CALL_BEGIN,
279
- {
280
- "call_id": call["call_id"],
281
- "name": call["name"],
282
- "args": call["arguments"],
283
- },
284
- )
285
- yield event(
286
- EventType.TOOL_CALL_END,
287
- {
288
- "call_id": call["call_id"],
289
- "name": call["name"],
290
- "result": call["result"],
291
- },
399
+ call_id = call["call_id"]
400
+ tool_item_id = stable_item_id(framework, run_id, "tool_call", call_id)
401
+ for ev in ensure_started(
402
+ item_id=tool_item_id,
403
+ item_kind="tool_call",
404
+ initial=ContentSnapshot(
405
+ parts=(
406
+ ToolCallContent(
407
+ part_id="tool-0",
408
+ call_id=call_id,
409
+ name=call["name"],
410
+ arguments=call["arguments"],
411
+ ),
412
+ )
413
+ ),
414
+ ):
415
+ yield ev
416
+ yield ItemCompleted(
417
+ **env_kwargs(tool_item_id, "item.completed", "tool-0"),
418
+ item_id=tool_item_id,
419
+ item_kind="tool_call",
420
+ snapshot=ContentSnapshot(
421
+ parts=(
422
+ ToolResultContent(
423
+ part_id="tool-0",
424
+ call_id=call_id,
425
+ result=call["result"],
426
+ ),
427
+ )
428
+ ),
292
429
  )
293
430
  text = str(result["output"])
294
- yield event(
295
- EventType.TEXT_DELTA,
296
- {"text": text},
297
- phase=EventPhase.FINAL_ANSWER.value,
431
+ for ev in ensure_started(
432
+ item_id=message_item_id,
433
+ item_kind="message",
434
+ phase="final_answer",
435
+ ):
436
+ yield ev
437
+ yield ItemUpdated(
438
+ **env_kwargs(message_item_id, "item.updated", "text-0"),
439
+ item_id=message_item_id,
440
+ item_kind="message",
441
+ op="append",
442
+ update=TextContent(part_id="text-0", text=text),
298
443
  )
299
- yield event(
300
- EventType.TEXT_COMPLETED,
301
- {"text": text},
302
- phase=EventPhase.FINAL_ANSWER.value,
444
+ yield ItemCompleted(
445
+ **env_kwargs(message_item_id, "item.completed", "text-0"),
446
+ item_id=message_item_id,
447
+ item_kind="message",
448
+ snapshot=ContentSnapshot(
449
+ parts=(TextContent(part_id="text-0", text=text),)
450
+ ),
303
451
  )
304
452
  run.done = True
305
- yield event(EventType.RUN_COMPLETED, {"status": "completed"})
453
+ yield RunCompleted(
454
+ **env_kwargs(run_item_id, "run.completed", "run"),
455
+ status="completed",
456
+ output_refs=(
457
+ OutputRef(
458
+ scope_id=scope_id,
459
+ item_id=message_item_id,
460
+ part_id="text-0",
461
+ ),
462
+ ),
463
+ )
306
464
  except asyncio.CancelledError:
307
465
  run.done = True
308
- yield event(
309
- EventType.RUN_CANCELED,
310
- {
311
- "status": "cancelled",
312
- "cancel_result": CancelResult.INTERRUPTED_ACTIVE_TURN.value,
313
- },
466
+ yield RunCanceled(
467
+ **env_kwargs(run_item_id, "run.canceled", "run"),
468
+ status="canceled",
469
+ reason=CancelResult.INTERRUPTED_ACTIVE_TURN.value,
314
470
  )
315
471
  except Exception as exc: # noqa: BLE001
316
472
  run.done = True
317
- yield event(
318
- EventType.RUN_FAILED,
319
- {"status": "failed", "error": str(exc)},
473
+ yield RunFailed(
474
+ **env_kwargs(run_item_id, "run.failed", "run"),
475
+ status="failed",
476
+ error=ErrorInfo(
477
+ code="harness_failed",
478
+ message=str(exc),
479
+ source=framework,
480
+ scope_id=scope_id,
481
+ ),
320
482
  )
321
483
 
322
484
  def _require_run(self, handle: RunHandle) -> _HarnessRun:
@@ -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
+ ]