agentengine-sdk-python 0.8.5__py3-none-any.whl → 0.8.6__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 (851) hide show
  1. {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +12 -8
  2. {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/RECORD +823 -388
  3. ksadk/_async_iterators.py +79 -0
  4. ksadk/_build_provenance.json +1 -1
  5. ksadk/_model_anthropic.py +49 -0
  6. ksadk/_model_input.py +86 -0
  7. ksadk/_model_json.py +40 -0
  8. ksadk/_model_reasoning.py +17 -0
  9. ksadk/_model_refusal.py +20 -0
  10. ksadk/_model_sse.py +163 -0
  11. ksadk/a2a/__init__.py +157 -167
  12. ksadk/a2a/_invocation_state.py +86 -0
  13. ksadk/a2a/_space_client_events.py +33 -22
  14. ksadk/a2a/adk.py +194 -0
  15. ksadk/a2a/adk_invocation_context.py +242 -0
  16. ksadk/a2a/adk_runtime.py +126 -0
  17. ksadk/a2a/adk_tools.py +319 -0
  18. ksadk/a2a/bootstrap.py +149 -23
  19. ksadk/a2a/build_validation.py +147 -0
  20. ksadk/a2a/card.py +23 -15
  21. ksadk/a2a/codex.py +160 -0
  22. ksadk/a2a/codex_checkpoint.py +111 -0
  23. ksadk/a2a/codex_recovery.py +96 -0
  24. ksadk/a2a/codex_recovery_events.py +123 -0
  25. ksadk/a2a/codex_runtime.py +198 -0
  26. ksadk/a2a/codex_session_checkpoint.py +162 -0
  27. ksadk/a2a/composition.py +88 -0
  28. ksadk/a2a/context_store.py +118 -19
  29. ksadk/a2a/control_plane.py +108 -106
  30. ksadk/a2a/event_adapter.py +92 -193
  31. ksadk/a2a/executor.py +257 -85
  32. ksadk/a2a/exposure.py +106 -0
  33. ksadk/a2a/external_transport.py +3 -4
  34. ksadk/a2a/identity.py +106 -12
  35. ksadk/a2a/ids.py +14 -3
  36. ksadk/a2a/inbound_kernel.py +133 -0
  37. ksadk/a2a/interaction_wire.py +76 -0
  38. ksadk/a2a/invocation_checkpoint.py +274 -0
  39. ksadk/a2a/invocation_policy.py +87 -0
  40. ksadk/a2a/invocation_publication.py +210 -0
  41. ksadk/a2a/invocation_service.py +972 -0
  42. ksadk/a2a/invocation_types.py +459 -0
  43. ksadk/a2a/kernel_task_adapter.py +259 -0
  44. ksadk/a2a/langgraph.py +20 -7
  45. ksadk/a2a/langgraph_invocation_context.py +136 -0
  46. ksadk/a2a/langgraph_managed.py +150 -0
  47. ksadk/a2a/langgraph_recovery.py +32 -0
  48. ksadk/a2a/langgraph_runtime.py +89 -0
  49. ksadk/a2a/langgraph_tool_runtime.py +132 -0
  50. ksadk/a2a/langgraph_tools.py +63 -0
  51. ksadk/a2a/message_digest.py +40 -0
  52. ksadk/a2a/platform.py +389 -0
  53. ksadk/a2a/policy_refs.py +13 -0
  54. ksadk/a2a/presentation.py +402 -0
  55. ksadk/a2a/product_kernel_facts.py +177 -0
  56. ksadk/a2a/product_key.py +99 -0
  57. ksadk/a2a/protocol_errors.py +116 -0
  58. ksadk/a2a/result_text.py +49 -0
  59. ksadk/a2a/resume_store.py +93 -3
  60. ksadk/a2a/routes.py +6 -1
  61. ksadk/a2a/runtime_approval.py +198 -0
  62. ksadk/a2a/runtime_input.py +151 -0
  63. ksadk/a2a/server.py +16 -7
  64. ksadk/a2a/space_client.py +101 -16
  65. ksadk/a2a/task_adapter.py +19 -5
  66. ksadk/a2a/task_event_dispatcher.py +39 -2
  67. ksadk/a2a/task_event_outbox.py +215 -0
  68. ksadk/a2a/task_event_outbox_owned.py +130 -0
  69. ksadk/a2a/task_store.py +37 -0
  70. ksadk/a2a/tool_activity.py +176 -0
  71. ksadk/a2a/workload_tokens.py +134 -0
  72. ksadk/api/client.py +32 -79
  73. ksadk/api/sse_stream.py +96 -0
  74. ksadk/builders/code_builder.py +83 -106
  75. ksadk/builders/container_builder.py +11 -29
  76. ksadk/builders/framework_requirements.py +2 -0
  77. ksadk/builders/managed_runtime_builder.py +12 -0
  78. ksadk/builders/source_provenance.py +87 -0
  79. ksadk/cli/cmd_a2a.py +43 -0
  80. ksadk/cli/cmd_build.py +9 -0
  81. ksadk/cli/cmd_deploy.py +27 -2
  82. ksadk/cli/cmd_invoke.py +45 -92
  83. ksadk/cli/cmd_studio.py +5 -1
  84. ksadk/cli/cmd_web.py +2 -0
  85. ksadk/cli/hosted_invoke.py +206 -0
  86. ksadk/cli/invoke_content.py +60 -0
  87. ksadk/cli/runtime_bootstrap.py +27 -5
  88. ksadk/codex/_expert_request_reader.py +48 -0
  89. ksadk/codex/a2a_tools.py +140 -0
  90. ksadk/codex/async_approval.py +169 -0
  91. ksadk/codex/async_client.py +938 -0
  92. ksadk/codex/async_proxy.py +216 -0
  93. ksadk/codex/base_runtime.py +25 -0
  94. ksadk/codex/client.py +3 -1048
  95. ksadk/codex/client_payloads.py +85 -0
  96. ksadk/codex/rollout_checkpoint.py +264 -0
  97. ksadk/codex/runtime.py +290 -54
  98. ksadk/common/auth.py +2 -2
  99. ksadk/common/cloud_headers.py +36 -0
  100. ksadk/common/diagnostics.py +34 -0
  101. ksadk/common/kop_client.py +2 -1
  102. ksadk/configs/env_registry.py +106 -127
  103. ksadk/configs/env_registry_a2a.py +173 -0
  104. ksadk/configs/env_registry_studio.py +53 -5
  105. ksadk/configs/global_config.py +1 -0
  106. ksadk/configs/settings.py +6 -0
  107. ksadk/context_engine/assembler.py +9 -0
  108. ksadk/context_engine/contributors.py +80 -17
  109. ksadk/context_engine/instruction_authority.py +18 -0
  110. ksadk/conversations/attachments.py +53 -15
  111. ksadk/conversations/contracts.py +28 -9
  112. ksadk/conversations/message_projection.py +30 -125
  113. ksadk/conversations/message_projection_blocks.py +137 -0
  114. ksadk/conversations/model_context.py +11 -3
  115. ksadk/conversations/projector.py +63 -0
  116. ksadk/conversations/runtime_compaction.py +7 -2
  117. ksadk/conversations/runtime_input.py +16 -4
  118. ksadk/conversations/runtime_payloads.py +4 -0
  119. ksadk/conversations/runtime_persistence.py +192 -24
  120. ksadk/conversations/runtime_preparation.py +85 -6
  121. ksadk/conversations/runtime_projection.py +217 -0
  122. ksadk/conversations/runtime_resume.py +141 -70
  123. ksadk/conversations/tool_receipt_resume.py +387 -0
  124. ksadk/conversations/tool_receipts.py +32 -0
  125. ksadk/deployment/env_forward.py +5 -0
  126. ksadk/deployment/manager.py +15 -6
  127. ksadk/deployment/providers/serverless.py +76 -136
  128. ksadk/deployment/providers/serverless_payloads.py +122 -0
  129. ksadk/evaluation/agent_eval_client.py +2 -1
  130. ksadk/evaluation/contracts.py +78 -3
  131. ksadk/evaluation/evaluators.py +166 -1
  132. ksadk/evaluation/evidence.py +271 -4
  133. ksadk/evaluation/local_adapter.py +76 -12
  134. ksadk/evaluation/studio_build_adapter.py +73 -9
  135. ksadk/events/adapters/_a2a_checkpoint.py +151 -0
  136. ksadk/events/adapters/_a2a_snapshot.py +18 -14
  137. ksadk/events/adapters/_a2a_support.py +15 -3
  138. ksadk/events/adapters/_a2a_tool_activity.py +123 -0
  139. ksadk/events/adapters/_codex_errors.py +49 -0
  140. ksadk/events/adapters/_langgraph_support.py +12 -1
  141. ksadk/events/adapters/a2a.py +54 -26
  142. ksadk/events/adapters/adk.py +188 -30
  143. ksadk/events/adapters/codex.py +33 -7
  144. ksadk/events/adapters/langgraph.py +16 -6
  145. ksadk/events/canonical.py +5 -0
  146. ksadk/events/canonical_store.py +200 -4
  147. ksadk/events/reducer.py +82 -0
  148. ksadk/events/run_authority.py +176 -0
  149. ksadk/harness/__init__.py +4 -0
  150. ksadk/harness/artifact_adapters/__init__.py +1 -0
  151. ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
  152. ksadk/harness/artifact_adapters/native_search.py +249 -0
  153. ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
  154. ksadk/harness/artifact_adapters/native_store.py +115 -0
  155. ksadk/harness/artifact_adapters/native_tool.py +222 -0
  156. ksadk/harness/artifact_store.py +26 -9
  157. ksadk/harness/browser_adapters/__init__.py +6 -0
  158. ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
  159. ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
  160. ksadk/harness/browser_adapters/native_playwright.py +953 -0
  161. ksadk/harness/browser_adapters/native_vision.py +295 -0
  162. ksadk/harness/capability_adapters/__init__.py +1 -0
  163. ksadk/harness/capability_adapters/native_dsh.py +289 -0
  164. ksadk/harness/capability_runtime.py +104 -9
  165. ksadk/harness/compaction_record.py +31 -0
  166. ksadk/harness/compiler.py +3 -3
  167. ksadk/harness/config.py +28 -5
  168. ksadk/harness/conformance/contract.py +9 -11
  169. ksadk/harness/context_engine.py +18 -33
  170. ksadk/harness/context_sections.py +397 -0
  171. ksadk/harness/diagnostic_adapters/__init__.py +1 -0
  172. ksadk/harness/diagnostic_adapters/contracts.py +70 -0
  173. ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
  174. ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
  175. ksadk/harness/engine/completion_guard.py +16 -1
  176. ksadk/harness/engine/context_pipeline.py +864 -92
  177. ksadk/harness/engine/graph_builder.py +123 -630
  178. ksadk/harness/engine/hooked_reasoner.py +380 -0
  179. ksadk/harness/engine/langgraph.py +126 -8
  180. ksadk/harness/engine/mcp_disclosure.py +65 -114
  181. ksadk/harness/engine/phases/__init__.py +6 -0
  182. ksadk/harness/engine/phases/context.py +48 -0
  183. ksadk/harness/engine/phases/interaction.py +31 -0
  184. ksadk/harness/engine/phases/reason.py +552 -0
  185. ksadk/harness/engine/phases/tools.py +638 -0
  186. ksadk/harness/engine/policy_runtime.py +21 -10
  187. ksadk/harness/engine/postgres_checkpointer.py +325 -2
  188. ksadk/harness/engine/run_control_bridge.py +21 -1
  189. ksadk/harness/engine/run_types.py +10 -0
  190. ksadk/harness/engine/skill_disclosure.py +98 -12
  191. ksadk/harness/engine/steering.py +177 -0
  192. ksadk/harness/engine/subagents.py +18 -1
  193. ksadk/harness/engine/tool_dispatch.py +112 -7
  194. ksadk/harness/events.py +39 -2
  195. ksadk/harness/execution_policy.py +10 -0
  196. ksadk/harness/hooks.py +259 -0
  197. ksadk/harness/loop/reason.py +281 -36
  198. ksadk/harness/loop/tools.py +157 -12
  199. ksadk/harness/managed_runtime.py +254 -94
  200. ksadk/harness/mcp_disclosure_contract.py +85 -0
  201. ksadk/harness/mcp_result_policy.py +44 -0
  202. ksadk/harness/mcp_runtime.py +33 -0
  203. ksadk/harness/micro_compact.py +69 -0
  204. ksadk/harness/model_adapters/__init__.py +1 -0
  205. ksadk/harness/model_adapters/native_mcp_media.py +100 -0
  206. ksadk/harness/model_adapters/native_mcp_result.py +36 -0
  207. ksadk/harness/model_adapters/native_openai.py +703 -0
  208. ksadk/harness/model_capability.py +223 -8
  209. ksadk/harness/model_provider.py +214 -4
  210. ksadk/harness/multimodal.py +57 -0
  211. ksadk/harness/native/__init__.py +1 -0
  212. ksadk/harness/native/activation_contract.py +25 -0
  213. ksadk/harness/native/activation_recovery.py +29 -0
  214. ksadk/harness/native/adapters.py +291 -0
  215. ksadk/harness/native/artifact_contract.py +14 -0
  216. ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
  217. ksadk/harness/native/artifact_read_capacity.py +182 -0
  218. ksadk/harness/native/artifact_read_contract.py +27 -0
  219. ksadk/harness/native/artifact_runtime.py +408 -0
  220. ksadk/harness/native/artifact_search_capacity.py +206 -0
  221. ksadk/harness/native/artifact_search_contract.py +40 -0
  222. ksadk/harness/native/artifact_single_read_capacity.py +170 -0
  223. ksadk/harness/native/browser_contract.py +229 -0
  224. ksadk/harness/native/browser_recovery.py +183 -0
  225. ksadk/harness/native/capabilities.py +204 -0
  226. ksadk/harness/native/child_approval.py +60 -0
  227. ksadk/harness/native/child_budget.py +136 -0
  228. ksadk/harness/native/child_cancellation.py +80 -0
  229. ksadk/harness/native/child_input.py +98 -0
  230. ksadk/harness/native/child_input_runtime.py +59 -0
  231. ksadk/harness/native/child_interruption.py +81 -0
  232. ksadk/harness/native/child_lifecycle.py +246 -0
  233. ksadk/harness/native/child_lifecycle_contract.py +91 -0
  234. ksadk/harness/native/child_notifications.py +75 -0
  235. ksadk/harness/native/child_promotion.py +66 -0
  236. ksadk/harness/native/command_runtime.py +99 -0
  237. ksadk/harness/native/completion.py +302 -0
  238. ksadk/harness/native/completion_text.py +116 -0
  239. ksadk/harness/native/context.py +358 -0
  240. ksadk/harness/native/context_artifact_page.py +75 -0
  241. ksadk/harness/native/context_compaction_projection.py +131 -0
  242. ksadk/harness/native/context_contributions.py +320 -0
  243. ksadk/harness/native/context_contributor_contract.py +133 -0
  244. ksadk/harness/native/context_driver.py +820 -0
  245. ksadk/harness/native/context_fresh_tools.py +49 -0
  246. ksadk/harness/native/context_history.py +272 -0
  247. ksadk/harness/native/context_microcompact.py +61 -0
  248. ksadk/harness/native/context_partial_summary.py +58 -0
  249. ksadk/harness/native/context_partition.py +492 -0
  250. ksadk/harness/native/context_pruning.py +275 -0
  251. ksadk/harness/native/context_reduction.py +60 -0
  252. ksadk/harness/native/context_replay.py +148 -0
  253. ksadk/harness/native/context_request_projection.py +526 -0
  254. ksadk/harness/native/context_runtime.py +976 -0
  255. ksadk/harness/native/context_runtime_contracts.py +409 -0
  256. ksadk/harness/native/context_search.py +112 -0
  257. ksadk/harness/native/context_source_fragments.py +188 -0
  258. ksadk/harness/native/context_source_progress.py +119 -0
  259. ksadk/harness/native/context_summary_planning.py +788 -0
  260. ksadk/harness/native/context_summary_recovery.py +105 -0
  261. ksadk/harness/native/delivery_review.py +331 -0
  262. ksadk/harness/native/delivery_review_contract.py +54 -0
  263. ksadk/harness/native/effect_admission.py +82 -0
  264. ksadk/harness/native/effect_control.py +318 -0
  265. ksadk/harness/native/effect_receipts.py +729 -0
  266. ksadk/harness/native/effect_runtime.py +303 -0
  267. ksadk/harness/native/effective_configuration.py +28 -0
  268. ksadk/harness/native/engine.py +945 -0
  269. ksadk/harness/native/final_output.py +34 -0
  270. ksadk/harness/native/final_submission.py +58 -0
  271. ksadk/harness/native/finalization_workspace.py +96 -0
  272. ksadk/harness/native/fork.py +151 -0
  273. ksadk/harness/native/guidance.py +91 -0
  274. ksadk/harness/native/history.py +381 -0
  275. ksadk/harness/native/hook_executor.py +205 -0
  276. ksadk/harness/native/hook_runtime_contract.py +282 -0
  277. ksadk/harness/native/interaction_observation.py +117 -0
  278. ksadk/harness/native/lease.py +103 -0
  279. ksadk/harness/native/machine.py +974 -0
  280. ksadk/harness/native/mcp_result_governance.py +156 -0
  281. ksadk/harness/native/model.py +570 -0
  282. ksadk/harness/native/model_feedback.py +63 -0
  283. ksadk/harness/native/model_input.py +30 -0
  284. ksadk/harness/native/model_recovery_contract.py +35 -0
  285. ksadk/harness/native/model_replay.py +128 -0
  286. ksadk/harness/native/model_request.py +133 -0
  287. ksadk/harness/native/model_runtime.py +196 -0
  288. ksadk/harness/native/model_takeover.py +419 -0
  289. ksadk/harness/native/model_tool_batch.py +40 -0
  290. ksadk/harness/native/observed_progress.py +46 -0
  291. ksadk/harness/native/operator_guidance.py +201 -0
  292. ksadk/harness/native/output_contract.py +80 -0
  293. ksadk/harness/native/output_recovery.py +24 -0
  294. ksadk/harness/native/ports.py +749 -0
  295. ksadk/harness/native/precompact_hook_runtime.py +171 -0
  296. ksadk/harness/native/replay_context.py +149 -0
  297. ksadk/harness/native/request_media.py +112 -0
  298. ksadk/harness/native/restore_contract.py +16 -0
  299. ksadk/harness/native/run_clock.py +120 -0
  300. ksadk/harness/native/state.py +436 -0
  301. ksadk/harness/native/steering.py +170 -0
  302. ksadk/harness/native/stop_hook_runtime.py +151 -0
  303. ksadk/harness/native/studio_admission.py +29 -0
  304. ksadk/harness/native/subagents.py +86 -0
  305. ksadk/harness/native/task_policy.py +99 -0
  306. ksadk/harness/native/task_progress.py +86 -0
  307. ksadk/harness/native/terminal_verification.py +43 -0
  308. ksadk/harness/native/tool_argument_feedback.py +178 -0
  309. ksadk/harness/native/tool_budget.py +253 -0
  310. ksadk/harness/native/tool_error_streak.py +89 -0
  311. ksadk/harness/native/tool_hook_runtime.py +343 -0
  312. ksadk/harness/native/tool_input_validation.py +58 -0
  313. ksadk/harness/native/tool_interruption.py +96 -0
  314. ksadk/harness/native/tool_observation.py +259 -0
  315. ksadk/harness/native/tool_progress.py +223 -0
  316. ksadk/harness/native/tool_recovery.py +25 -0
  317. ksadk/harness/native/tool_scheduling.py +33 -0
  318. ksadk/harness/native/tool_schema.py +126 -0
  319. ksadk/harness/native/transitions.py +151 -0
  320. ksadk/harness/native/turn_control.py +98 -0
  321. ksadk/harness/native/user_document.py +98 -0
  322. ksadk/harness/native/user_document_capture.py +49 -0
  323. ksadk/harness/native/user_input.py +87 -0
  324. ksadk/harness/native/verification.py +432 -0
  325. ksadk/harness/native/verification_binding.py +40 -0
  326. ksadk/harness/native/verification_runtime.py +233 -0
  327. ksadk/harness/native/verification_workspace.py +67 -0
  328. ksadk/harness/native_driver_failure.py +123 -0
  329. ksadk/harness/native_facade.py +977 -0
  330. ksadk/harness/native_factory.py +244 -0
  331. ksadk/harness/native_projection.py +503 -0
  332. ksadk/harness/native_runtime.py +621 -0
  333. ksadk/harness/native_shadow.py +250 -0
  334. ksadk/harness/native_shadow_inputs.py +146 -0
  335. ksadk/harness/progress_adapters/__init__.py +5 -0
  336. ksadk/harness/progress_adapters/native_todo.py +75 -0
  337. ksadk/harness/prompt_cache.py +65 -3
  338. ksadk/harness/public_activity.py +59 -0
  339. ksadk/harness/public_output.py +30 -0
  340. ksadk/harness/public_summary.py +36 -0
  341. ksadk/harness/reasoner.py +331 -22
  342. ksadk/harness/rpc.py +200 -0
  343. ksadk/harness/run_control.py +107 -2
  344. ksadk/harness/runtime.py +11 -2
  345. ksadk/harness/runtime_capabilities.py +71 -1
  346. ksadk/harness/sandbox_backend.py +203 -0
  347. ksadk/harness/sdk.py +153 -0
  348. ksadk/harness/session_store.py +370 -24
  349. ksadk/harness/skill_adapters/__init__.py +1 -0
  350. ksadk/harness/skill_adapters/native_bundle.py +148 -0
  351. ksadk/harness/skill_adapters/native_disclosure.py +306 -0
  352. ksadk/harness/skill_intent.py +47 -0
  353. ksadk/harness/skill_runtime.py +74 -16
  354. ksadk/harness/spec.py +20 -10
  355. ksadk/harness/state.py +2 -0
  356. ksadk/harness/stores/__init__.py +14 -0
  357. ksadk/harness/stores/native_command_settlement.py +65 -0
  358. ksadk/harness/stores/native_contract.py +311 -0
  359. ksadk/harness/stores/native_memory.py +326 -0
  360. ksadk/harness/stores/native_memory_archive.py +70 -0
  361. ksadk/harness/stores/native_migration_cli.py +91 -0
  362. ksadk/harness/stores/native_outbox.py +56 -0
  363. ksadk/harness/stores/native_sqlite.py +782 -0
  364. ksadk/harness/stores/native_sqlite_audit.py +29 -0
  365. ksadk/harness/stores/native_sqlite_migration.py +252 -0
  366. ksadk/harness/subagent.py +12 -2
  367. ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
  368. ksadk/harness/subagent_adapters/native_background_child.py +803 -0
  369. ksadk/harness/subagent_adapters/native_child.py +819 -0
  370. ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
  371. ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
  372. ksadk/harness/subagent_adapters/native_child_result.py +392 -0
  373. ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
  374. ksadk/harness/tool_display.py +75 -0
  375. ksadk/harness/tool_display_contract.py +134 -0
  376. ksadk/harness/tool_output.py +141 -0
  377. ksadk/harness/tool_policy.py +3 -0
  378. ksadk/harness/tool_result_policy.py +216 -0
  379. ksadk/harness/tools.py +52 -0
  380. ksadk/harness/workspace_adapters/__init__.py +6 -0
  381. ksadk/harness/workspace_adapters/native_directory.py +180 -0
  382. ksadk/harness/workspace_adapters/native_git.py +208 -0
  383. ksadk/harness/workspace_adapters/native_isolation.py +350 -0
  384. ksadk/interaction/providers/langgraph.py +8 -1
  385. ksadk/kernel/bootstrap.py +144 -160
  386. ksadk/kernel/contract_fingerprints.py +45 -1
  387. ksadk/kernel/contracts.py +25 -0
  388. ksadk/kernel/control.py +153 -33
  389. ksadk/kernel/execution_grants.py +209 -2
  390. ksadk/kernel/execution_grants_memory.py +127 -8
  391. ksadk/kernel/execution_grants_postgres.py +188 -10
  392. ksadk/kernel/execution_grants_sqlite.py +235 -9
  393. ksadk/kernel/execution_host_ingress.py +1071 -0
  394. ksadk/kernel/history_projection.py +120 -0
  395. ksadk/kernel/ingress.py +117 -204
  396. ksadk/kernel/ingress_bootstrap.py +268 -0
  397. ksadk/kernel/legacy_history.py +179 -0
  398. ksadk/kernel/memory_store.py +38 -48
  399. ksadk/kernel/memory_store_projection.py +63 -0
  400. ksadk/kernel/postgres_event_log.py +181 -0
  401. ksadk/kernel/postgres_store.py +167 -198
  402. ksadk/kernel/readiness.py +125 -0
  403. ksadk/kernel/recovery.py +89 -3
  404. ksadk/kernel/recovery_projection.py +124 -0
  405. ksadk/kernel/runtime_checkpoint.py +34 -0
  406. ksadk/kernel/sql/001_agent_kernel.sql +5 -0
  407. ksadk/kernel/sqlite_schema.py +100 -0
  408. ksadk/kernel/sqlite_store.py +147 -216
  409. ksadk/kernel/store.py +47 -15
  410. ksadk/kernel/teams_artifact_tools.py +392 -0
  411. ksadk/kernel/teams_effects.py +851 -0
  412. ksadk/kernel/teams_execution_context.py +408 -0
  413. ksadk/kernel/teams_host_http.py +237 -0
  414. ksadk/kernel/teams_material_transport.py +245 -0
  415. ksadk/kernel/teams_materials.py +318 -0
  416. ksadk/kernel/teams_runtime_bootstrap.py +604 -0
  417. ksadk/kernel/teams_tool_runtime.py +273 -0
  418. ksadk/kernel/teams_workspace.py +259 -0
  419. ksadk/kernel/worker.py +323 -332
  420. ksadk/kernel/worker_controls.py +454 -0
  421. ksadk/kernel/worker_identity.py +27 -0
  422. ksadk/kernel/worker_interactions.py +197 -0
  423. ksadk/knowledge_base/client.py +15 -1
  424. ksadk/managed_runtime.py +29 -2
  425. ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
  426. ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
  427. ksadk/memory/adk/bounded_database_session_service.py +232 -0
  428. ksadk/memory/adk/resilient_session_service.py +115 -15
  429. ksadk/memory/adk/short_term_memory.py +8 -9
  430. ksadk/memory/extraction.py +120 -7
  431. ksadk/memory/providers/local_candidates.py +183 -0
  432. ksadk/memory/providers/local_sqlite.py +252 -78
  433. ksadk/memory/resolved_policy.py +12 -7
  434. ksadk/model_gateway/__init__.py +29 -0
  435. ksadk/model_gateway/client.py +253 -0
  436. ksadk/model_gateway/events.py +113 -0
  437. ksadk/model_gateway/matrix.py +297 -0
  438. ksadk/model_proxy/compat.py +670 -0
  439. ksadk/model_proxy/server.py +10 -7
  440. ksadk/model_proxy/transform.py +37 -9
  441. ksadk/plugins/bridges/dsh.py +18 -20
  442. ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
  443. ksadk/plugins/builtin_resources.py +199 -0
  444. ksadk/plugins/builtins.py +380 -186
  445. ksadk/plugins/context_contributor.py +15 -4
  446. ksadk/plugins/dsh_dependency_policy.py +41 -0
  447. ksadk/plugins/dsh_toolchain.py +24 -35
  448. ksadk/plugins/execution_host.py +8 -0
  449. ksadk/plugins/host.py +73 -5
  450. ksadk/plugins/kernel_adapter.py +44 -1
  451. ksadk/plugins/memory_provider.py +180 -0
  452. ksadk/plugins/providers/_process_group.py +50 -0
  453. ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
  454. ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
  455. ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
  456. ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
  457. ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +1 -1
  458. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +1 -1
  459. ksadk/plugins/providers/codex.py +42 -38
  460. ksadk/plugins/providers/codex_native.py +20 -0
  461. ksadk/plugins/providers/codex_skills.py +46 -0
  462. ksadk/plugins/providers/dsh_capabilities.py +16 -171
  463. ksadk/plugins/providers/dsh_connector_lease.py +225 -0
  464. ksadk/plugins/providers/dsh_mcp.py +163 -1
  465. ksadk/plugins/providers/harness.py +247 -34
  466. ksadk/plugins/providers/harness_context.py +61 -0
  467. ksadk/plugins/providers/harness_contributions.py +241 -0
  468. ksadk/plugins/providers/harness_delegation.py +91 -14
  469. ksadk/plugins/providers/harness_hooks.py +121 -0
  470. ksadk/plugins/providers/harness_managed.py +269 -175
  471. ksadk/plugins/providers/harness_tools.py +165 -36
  472. ksadk/plugins/providers/legacy_catalog.py +1 -1
  473. ksadk/plugins/providers/mcp_projection.py +100 -3
  474. ksadk/plugins/providers/platform_resources.py +16 -6
  475. ksadk/plugins/teams/application.py +3 -143
  476. ksadk/plugins/teams/build_artifacts.py +460 -0
  477. ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
  478. ksadk/plugins/teams/cloud_contracts.py +928 -0
  479. ksadk/plugins/teams/cloud_permits.py +250 -0
  480. ksadk/plugins/teams/domain.py +201 -148
  481. ksadk/plugins/teams/effect_contracts.py +255 -0
  482. ksadk/plugins/teams/execution_projection.py +255 -0
  483. ksadk/plugins/teams/leader_decisions.py +106 -0
  484. ksadk/plugins/teams/postgres_store.py +299 -85
  485. ksadk/plugins/teams/release_contracts.py +60 -0
  486. ksadk/plugins/teams/runtime.py +116 -40
  487. ksadk/plugins/teams/store.py +214 -6
  488. ksadk/plugins/teams/task_decisions.py +21 -8
  489. ksadk/plugins/teams/tool_service.py +152 -0
  490. ksadk/plugins/teams/transport.py +8 -3
  491. ksadk/resource_runtime/skill_runtime.py +3 -0
  492. ksadk/resource_runtime/socket_server.py +11 -0
  493. ksadk/resource_runtime/worker.py +28 -4
  494. ksadk/runners/_adk_a2a_stream.py +122 -0
  495. ksadk/runners/_adk_canonical_stream.py +474 -0
  496. ksadk/runners/_langgraph_canonical_streams.py +527 -0
  497. ksadk/runners/_langgraph_runner_streams.py +6 -400
  498. ksadk/runners/_langgraph_tool_projection.py +86 -0
  499. ksadk/runners/_langgraph_tools_transformer.py +27 -0
  500. ksadk/runners/adk_runner.py +195 -290
  501. ksadk/runners/base_runner.py +6 -5
  502. ksadk/runners/langgraph_runner.py +82 -86
  503. ksadk/runners/utils/loader.py +28 -14
  504. ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
  505. ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
  506. ksadk/runtime/_runner_adapter/stream_mapping.py +83 -128
  507. ksadk/runtime/adapter.py +40 -3
  508. ksadk/runtime/conversation_execution.py +4 -2
  509. ksadk/runtime/executor.py +97 -7
  510. ksadk/runtime/factory.py +13 -6
  511. ksadk/runtime/framework_adapters.py +184 -10
  512. ksadk/runtime/hosted_finalizer.py +4 -6
  513. ksadk/runtime/launch.py +2 -0
  514. ksadk/runtime/runner_adapter.py +123 -13
  515. ksadk/runtime_context.py +2 -0
  516. ksadk/sandbox/backends/e2b.py +30 -4
  517. ksadk/sandbox/backends/local_process.py +10 -0
  518. ksadk/sandbox/e2b_connection.py +9 -1
  519. ksadk/sandbox/local_controls.py +32 -2
  520. ksadk/sandbox/local_launcher.py +34 -0
  521. ksadk/server/factory.py +178 -25
  522. ksadk/server/history_deadline.py +158 -0
  523. ksadk/server/history_page_cache.py +129 -0
  524. ksadk/server/routes/checkpoint_audit.py +88 -0
  525. ksadk/server/routes/checkpoint_listing.py +294 -0
  526. ksadk/server/routes/checkpoint_resolution.py +73 -20
  527. ksadk/server/routes/control.py +51 -3
  528. ksadk/server/routes/display_projection.py +154 -0
  529. ksadk/server/routes/kernel_ingress.py +17 -2
  530. ksadk/server/routes/misc.py +102 -12
  531. ksadk/server/routes/models.py +25 -1
  532. ksadk/server/routes/openai_compat.py +6 -0
  533. ksadk/server/routes/projection.py +159 -216
  534. ksadk/server/routes/run.py +6 -2
  535. ksadk/server/routes/sessions.py +301 -342
  536. ksadk/server/routes/streaming.py +68 -15
  537. ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
  538. ksadk/server/routes/workspace.py +5 -2
  539. ksadk/server/static/assets/{ArtifactsPanel-C1YoaKhx.js → ArtifactsPanel-CILaW-fC.js} +1 -1
  540. ksadk/server/static/assets/{CodeBlock-DHuAWfr5.js → CodeBlock-BVrNVtJC.js} +1 -1
  541. ksadk/server/static/assets/{MathMessageMarkdown-cvdrBwYr.js → MathMessageMarkdown-Dp7c4wWD.js} +1 -1
  542. ksadk/server/static/assets/{MermaidBlock-DeBkbJvI.js → MermaidBlock-Dxop8Rd7.js} +6 -6
  543. ksadk/server/static/assets/{NativeTerminalPanel-oJj44_sV.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
  544. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-Dhfv25o2.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
  545. ksadk/server/static/assets/{arc-C35w-pn1.js → arc-DqxJede-.js} +1 -1
  546. ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
  547. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-FoMY_u6D.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
  548. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-zD4Rt7oE.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
  549. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BCtGGkhN.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
  550. ksadk/server/static/assets/channel-fySsnkft.js +1 -0
  551. ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
  552. ksadk/server/static/assets/{chunk-5VM5RSS4-C2Ms13_k.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
  553. ksadk/server/static/assets/{chunk-F27PBJKO-BoTj-qgx.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
  554. ksadk/server/static/assets/{chunk-G27WJ6UU-DOMyyjHH.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
  555. ksadk/server/static/assets/{chunk-JWPE2WC7-DbJJqDli.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
  556. ksadk/server/static/assets/{chunk-LCL6LL3I-CLuRCt_W.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
  557. ksadk/server/static/assets/{chunk-POPQ4Y6H-D0Dz847e.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
  558. ksadk/server/static/assets/{chunk-RHFEMEQ7-BWSRzEcd.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
  559. ksadk/server/static/assets/{chunk-SVP7TREG-CPoHqkCY.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
  560. ksadk/server/static/assets/{chunk-XXDRQBXY-Bx1jS-X-.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
  561. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
  562. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
  563. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-LzyWm4m0.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
  564. ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
  565. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-BlW_bHED.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
  566. ksadk/server/static/assets/{dagre-3AP2YEHR-Bu_S86_i.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
  567. ksadk/server/static/assets/{dagre-B7nCawed.js → dagre-DfvnEf45.js} +1 -1
  568. ksadk/server/static/assets/{diagram-S7CK7UJ4-W_Zow2Km.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
  569. ksadk/server/static/assets/{diagram-UQ7AKVKN-CLIKAHON.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
  570. ksadk/server/static/assets/{diagram-VSXAHHWV-Dv6_QAlN.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
  571. ksadk/server/static/assets/{diagram-VX7I27RA-BWAWRDtZ.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
  572. ksadk/server/static/assets/{diagram-Z3DM3KII-XA_rWMss.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
  573. ksadk/server/static/assets/{dist-CGt_UGeO.js → dist-0uJ4tdx6.js} +1 -1
  574. ksadk/server/static/assets/{dist-C0J5_3qM.js → dist-AEv-vXf-.js} +1 -1
  575. ksadk/server/static/assets/{dist-CIpWk_5f.js → dist-B49GzZDb.js} +1 -1
  576. ksadk/server/static/assets/{dist-B3bA05-e.js → dist-B8Myiet9.js} +1 -1
  577. ksadk/server/static/assets/{dist-DWfdmz9s.js → dist-BBsYarrI.js} +1 -1
  578. ksadk/server/static/assets/{dist-BLpRy_Yx.js → dist-BQMrUwdI.js} +1 -1
  579. ksadk/server/static/assets/{dist-CIRMvUM4.js → dist-BX_-FENW.js} +1 -1
  580. ksadk/server/static/assets/{dist-BdNFAney.js → dist-CD4L6ymH.js} +1 -1
  581. ksadk/server/static/assets/{dist-n3n6t_FO.js → dist-CHpW1BHj.js} +1 -1
  582. ksadk/server/static/assets/{dist-DppE_r-D.js → dist-CVPau3tn.js} +1 -1
  583. ksadk/server/static/assets/{dist-qe8xjesy.js → dist-C_qdxcSH.js} +1 -1
  584. ksadk/server/static/assets/{dist-2vL2sAdF.js → dist-Co68Apq4.js} +1 -1
  585. ksadk/server/static/assets/{dist-1nXCdsej.js → dist-Cp2PaOMY.js} +1 -1
  586. ksadk/server/static/assets/{dist-DNKuMzWc.js → dist-CuR5Bgme.js} +1 -1
  587. ksadk/server/static/assets/{dist-t6MzE0jU.js → dist-DDSyLEOX.js} +1 -1
  588. ksadk/server/static/assets/{dist-CPyieXEf.js → dist-DUxO0R99.js} +1 -1
  589. ksadk/server/static/assets/{dist-DyG6Ya-z.js → dist-QzbGrED_.js} +1 -1
  590. ksadk/server/static/assets/{dist-0X_j2Rcc.js → dist-bupkyEBZ.js} +1 -1
  591. ksadk/server/static/assets/{dist-mqD5TZup.js → dist-cxTGfdqx.js} +1 -1
  592. ksadk/server/static/assets/{dist-M-SrdhhZ.js → dist-hL5p1til.js} +1 -1
  593. ksadk/server/static/assets/{dist-D-92S-Fd.js → dist-lOy23y43.js} +1 -1
  594. ksadk/server/static/assets/{dist-BO_UwatH.js → dist-pq-nD33R.js} +1 -1
  595. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-BfCzF1Xi.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
  596. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-Dpz9_0zn.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
  597. ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
  598. ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
  599. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DDaG1f4_.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
  600. ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
  601. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DcxzRwYC.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
  602. ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
  603. ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
  604. ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
  605. ksadk/server/static/assets/{infoDiagram-RXCK75RN-CYMdn6lQ.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
  606. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CLHFAD6c.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
  607. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-BHSKQGAl.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
  608. ksadk/server/static/assets/{kanban-definition-3QL26DDD-D5W3tjTT.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
  609. ksadk/server/static/assets/{katex-mtjOi4KM.js → katex-BT-X-V7U.js} +1 -1
  610. ksadk/server/static/assets/{linear-BETqsxE_.js → linear-DTR631iG.js} +1 -1
  611. ksadk/server/static/assets/{mermaid-parser.core-DPWrvs90.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
  612. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-CJG2mfBP.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
  613. ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
  614. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-GjAPNaqn.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
  615. ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
  616. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-ToIewrqr.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
  617. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-4d78KiEY.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
  618. ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
  619. ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
  620. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
  621. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
  622. ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
  623. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-DKzx4xfv.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
  624. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-CJYljxQS.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
  625. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-DLU2fV1w.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
  626. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CVqysrA9.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
  627. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-BUxfmTHc.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
  628. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-CNFgYI9E.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
  629. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
  630. ksadk/server/static/assets/{swimlanes-XN3QIQJK-B6qCMe8N.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
  631. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
  632. ksadk/server/static/assets/{timeline-definition-24CTP7MA-CMD3x_U_.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
  633. ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
  634. ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
  635. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BqtUqvXM.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
  636. ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
  637. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-B5KfDjI-.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
  638. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BaUlSZrn.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
  639. ksadk/server/static/index.html +2 -2
  640. ksadk/sessions/__init__.py +8 -1
  641. ksadk/sessions/_checkpoint_resume_audit.py +44 -0
  642. ksadk/sessions/_in_memory_query.py +112 -0
  643. ksadk/sessions/_local_service_sync.py +157 -156
  644. ksadk/sessions/_local_state_sync.py +152 -0
  645. ksadk/sessions/_local_tables.py +2 -0
  646. ksadk/sessions/_postgres_checkpoint_read.py +323 -0
  647. ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
  648. ksadk/sessions/_postgres_history_read.py +678 -0
  649. ksadk/sessions/_postgres_schema.py +44 -2
  650. ksadk/sessions/_postgres_tables.py +2 -0
  651. ksadk/sessions/_postgres_tool_receipts.py +169 -0
  652. ksadk/sessions/_resilient_read.py +630 -0
  653. ksadk/sessions/_tool_receipt_sync.py +119 -0
  654. ksadk/sessions/agent_identity.py +16 -0
  655. ksadk/sessions/base.py +278 -0
  656. ksadk/sessions/db_budget.py +332 -0
  657. ksadk/sessions/errors.py +12 -0
  658. ksadk/sessions/history_budget.py +36 -0
  659. ksadk/sessions/history_identity.py +27 -0
  660. ksadk/sessions/in_memory.py +376 -113
  661. ksadk/sessions/local_service.py +345 -0
  662. ksadk/sessions/postgres_service.py +515 -549
  663. ksadk/sessions/resilience.py +21 -14
  664. ksadk/sessions/resilient.py +611 -504
  665. ksadk/skills/loader.py +44 -2
  666. ksadk/skills/runtime/backends/e2b.py +17 -14
  667. ksadk/skills/service_client.py +6 -1
  668. ksadk/studio/a2a_bindings.py +407 -0
  669. ksadk/studio/a2a_orchestration.py +178 -0
  670. ksadk/studio/active_run_output.py +92 -0
  671. ksadk/studio/activity_records.py +542 -0
  672. ksadk/studio/agent_configuration.py +173 -0
  673. ksadk/studio/api.py +219 -389
  674. ksadk/studio/api_a2a_routes.py +93 -0
  675. ksadk/studio/api_catalog_routes.py +13 -0
  676. ksadk/studio/api_cloud_chat_routes.py +382 -0
  677. ksadk/studio/api_contracts.py +23 -0
  678. ksadk/studio/attachment_store.py +14 -2
  679. ksadk/studio/build_resolution.py +117 -0
  680. ksadk/studio/build_singleflight.py +37 -0
  681. ksadk/studio/builder.py +20 -2
  682. ksadk/studio/capabilities.py +8 -3
  683. ksadk/studio/cloud.py +83 -377
  684. ksadk/studio/cloud_gateways.py +424 -0
  685. ksadk/studio/cloud_shared_web.py +7 -0
  686. ksadk/studio/codex_agent_service.py +17 -0
  687. ksadk/studio/codex_manifest.py +5 -1
  688. ksadk/studio/codex_provider_build.py +65 -0
  689. ksadk/studio/compiler.py +102 -6
  690. ksadk/studio/contract_base.py +19 -0
  691. ksadk/studio/contracts.py +231 -201
  692. ksadk/studio/dsh_application.py +58 -12
  693. ksadk/studio/dsh_capability_service.py +17 -171
  694. ksadk/studio/dsh_mcp_transport.py +191 -0
  695. ksadk/studio/event_store.py +17 -0
  696. ksadk/studio/execution_host.py +84 -11
  697. ksadk/studio/framework_run.py +18 -0
  698. ksadk/studio/interaction_submission.py +265 -0
  699. ksadk/studio/kernel_registry.py +12 -1
  700. ksadk/studio/lifecycle_status.py +43 -0
  701. ksadk/studio/model_buffered_wire.py +227 -0
  702. ksadk/studio/model_chat_tools.py +143 -0
  703. ksadk/studio/model_client.py +1241 -761
  704. ksadk/studio/model_content_stream.py +129 -0
  705. ksadk/studio/model_credentials.py +196 -0
  706. ksadk/studio/model_profile_service.py +65 -31
  707. ksadk/studio/model_request_projection.py +284 -0
  708. ksadk/studio/model_responses_content.py +296 -0
  709. ksadk/studio/model_usage.py +109 -0
  710. ksadk/studio/model_wire_failure.py +110 -0
  711. ksadk/studio/model_wire_identity.py +138 -0
  712. ksadk/studio/model_wire_snapshot.py +45 -0
  713. ksadk/studio/model_wire_tools.py +283 -0
  714. ksadk/studio/native_acceptance.py +68 -0
  715. ksadk/studio/native_approval.py +111 -0
  716. ksadk/studio/native_browser_port.py +861 -0
  717. ksadk/studio/native_child_mcp.py +87 -0
  718. ksadk/studio/native_child_publication.py +68 -0
  719. ksadk/studio/native_child_skills.py +72 -0
  720. ksadk/studio/native_child_workspace.py +176 -0
  721. ksadk/studio/native_command_policy.py +53 -0
  722. ksadk/studio/native_context_port.py +326 -0
  723. ksadk/studio/native_context_registration.py +54 -0
  724. ksadk/studio/native_document_input.py +88 -0
  725. ksadk/studio/native_final_shape.py +852 -0
  726. ksadk/studio/native_gateway_stream.py +69 -0
  727. ksadk/studio/native_hook_port.py +145 -0
  728. ksadk/studio/native_hook_registration.py +70 -0
  729. ksadk/studio/native_inventory_disclosure.py +223 -0
  730. ksadk/studio/native_kernel_admission.py +84 -0
  731. ksadk/studio/native_language_diagnostics.py +320 -0
  732. ksadk/studio/native_mcp_disclosure.py +198 -0
  733. ksadk/studio/native_mcp_tool_port.py +219 -0
  734. ksadk/studio/native_memory_acceptance.py +362 -0
  735. ksadk/studio/native_memory_context.py +266 -0
  736. ksadk/studio/native_memory_flush.py +174 -0
  737. ksadk/studio/native_memory_sources.py +80 -0
  738. ksadk/studio/native_memory_tool_port.py +360 -0
  739. ksadk/studio/native_memory_turn.py +183 -0
  740. ksadk/studio/native_model_port.py +765 -0
  741. ksadk/studio/native_model_recovery.py +126 -0
  742. ksadk/studio/native_options.py +75 -0
  743. ksadk/studio/native_output_fields.py +58 -0
  744. ksadk/studio/native_planning.py +156 -0
  745. ksadk/studio/native_product.py +988 -0
  746. ksadk/studio/native_read_budget.py +426 -0
  747. ksadk/studio/native_recovery.py +171 -0
  748. ksadk/studio/native_scope.py +35 -0
  749. ksadk/studio/native_session_context_port.py +141 -0
  750. ksadk/studio/native_session_engine.py +14 -0
  751. ksadk/studio/native_skill_source.py +74 -0
  752. ksadk/studio/native_subagent_port.py +700 -0
  753. ksadk/studio/native_terminal_recovery.py +95 -0
  754. ksadk/studio/native_test_action.py +610 -0
  755. ksadk/studio/native_tool_port.py +477 -0
  756. ksadk/studio/native_user_input.py +60 -0
  757. ksadk/studio/native_verification_presentation.py +65 -0
  758. ksadk/studio/native_workspace_diagnostics.py +183 -0
  759. ksadk/studio/native_workspace_port.py +43 -0
  760. ksadk/studio/operations.py +34 -9
  761. ksadk/studio/plugin_composition.py +26 -10
  762. ksadk/studio/plugin_kernel_adapter.py +75 -1
  763. ksadk/studio/plugin_native_activation.py +163 -0
  764. ksadk/studio/plugin_runtime.py +639 -119
  765. ksadk/studio/plugin_runtime_admission.py +57 -0
  766. ksadk/studio/presentation.py +92 -0
  767. ksadk/studio/public_output_store.py +69 -0
  768. ksadk/studio/resource_authority.py +11 -3
  769. ksadk/studio/resource_catalog.py +8 -12
  770. ksadk/studio/run_activity.py +338 -385
  771. ksadk/studio/run_controls.py +185 -0
  772. ksadk/studio/run_service.py +908 -319
  773. ksadk/studio/run_submission_receipts.py +68 -0
  774. ksadk/studio/runtime_catalog.py +23 -4
  775. ksadk/studio/runtime_prewarm.py +22 -0
  776. ksadk/studio/scheduler_assistant.py +4 -1
  777. ksadk/studio/service.py +356 -282
  778. ksadk/studio/service_settings.py +229 -0
  779. ksadk/studio/shared_web.py +393 -169
  780. ksadk/studio/shared_web_response_events.py +180 -0
  781. ksadk/studio/shared_web_run_state.py +133 -0
  782. ksadk/studio/skill_discovery.py +305 -3
  783. ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
  784. ksadk/studio/static/assets/{CodeBlock-DMIf4h33-UIqo-BPW.js → CodeBlock-DMIf4h33-CkufcPYo.js} +3 -3
  785. ksadk/studio/static/assets/{MathMessageMarkdown-BesSeCYl-OhNwH4K9.js → MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js} +1 -1
  786. ksadk/studio/static/assets/{MessageMarkdown-CwMTvgFj-g0I-I4dD.js → MessageMarkdown-CwMTvgFj-BeyLyQHu.js} +2 -2
  787. ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
  788. ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
  789. ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
  790. ksadk/studio/static/index.html +3 -3
  791. ksadk/studio/teams_catalog.py +33 -0
  792. ksadk/studio/teams_installation.py +4 -1
  793. ksadk/studio/teams_node.py +4 -0
  794. ksadk/studio/teams_node_factory.py +558 -0
  795. ksadk/studio/teams_node_runner.py +3 -0
  796. ksadk/studio/teams_node_v1.py +935 -0
  797. ksadk/studio/teams_remote.py +259 -37
  798. ksadk/studio/templates.py +1 -0
  799. ksadk/studio/workspace_plugins.py +3 -1
  800. ksadk/tools/a2a_policy.py +5 -0
  801. ksadk/tools/artifact_observation.py +53 -0
  802. ksadk/tools/captured_source_artifact.py +68 -0
  803. ksadk/tools/schema.py +34 -0
  804. ksadk/toolsets/__init__.py +82 -88
  805. ksadk/toolsets/a2a.py +89 -89
  806. ksadk/toolsets/sandbox.py +377 -6
  807. ksadk/toolsets/skill_management.py +315 -0
  808. ksadk/toolsets/tool_selection.py +94 -0
  809. ksadk/toolsets/workspace.py +342 -324
  810. ksadk/toolsets/workspace_editing.py +291 -0
  811. ksadk/toolsets/workspace_model_observation.py +104 -0
  812. ksadk/toolsets/workspace_mutation.py +75 -0
  813. ksadk/toolsets/workspace_read_budget.py +216 -0
  814. ksadk/toolsets/workspace_search.py +192 -0
  815. ksadk/toolsets/workspace_search_process.py +129 -0
  816. ksadk/toolsets/workspace_state.py +6 -0
  817. ksadk/version.py +1 -1
  818. ksadk_runtime_common/http_headers.py +18 -0
  819. ksadk_runtime_common/workspace_files/router.py +2 -1
  820. ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +0 -1
  821. ksadk/server/static/assets/channel-_KDifNys.js +0 -1
  822. ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +0 -1
  823. ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +0 -1
  824. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +0 -1
  825. ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +0 -1
  826. ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +0 -1
  827. ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +0 -1
  828. ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +0 -1
  829. ksadk/server/static/assets/index-BMd2mucF.css +0 -2
  830. ksadk/server/static/assets/index-D5qyyhTH.js +0 -244
  831. ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +0 -1
  832. ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +0 -1
  833. ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +0 -1
  834. ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +0 -1
  835. ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +0 -1
  836. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +0 -1
  837. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +0 -1
  838. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +0 -1
  839. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +0 -1
  840. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +0 -8
  841. ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +0 -1
  842. ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +0 -1
  843. ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +0 -1
  844. ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +0 -8
  845. ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +0 -3
  846. ksadk/studio/static/assets/index-CfEnms6Y.css +0 -2
  847. ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
  848. {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
  849. {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
  850. {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
  851. {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
@@ -34,14 +34,20 @@ from ksadk.events.content import ContentSnapshot, TextContent
34
34
  from ksadk.events.identity import stable_event_id, stable_item_id, stable_scope_id
35
35
  from ksadk.harness.context_engine import HarnessContextEngine
36
36
  from ksadk.harness.engine.langgraph import ManagedLangGraphEngine, memory_checkpointer
37
+ from ksadk.harness.engine.steering import SteerReceipt
37
38
  from ksadk.harness.events import EventType
38
39
  from ksadk.harness.events import RuntimeEvent as HarnessEvent
39
40
  from ksadk.harness.execution_policy import ExecutionPolicy, ExecutionPolicyResolver
40
41
  from ksadk.harness.public_activity import tool_public_action
41
42
  from ksadk.harness.reasoner import HarnessReasoner
43
+ from ksadk.harness.runtime_capabilities import (
44
+ managed_harness_capabilities,
45
+ managed_harness_native_capabilities,
46
+ )
42
47
  from ksadk.harness.skill_composition import compose_engine
43
48
  from ksadk.harness.spec import HarnessSpec
44
- from ksadk.kernel.contracts import RuntimeCapability, RuntimeCapabilityMatrix
49
+ from ksadk.harness.tool_display import safe_tool_display, tool_display_start
50
+ from ksadk.kernel.contracts import RuntimeCapabilityMatrix, SteerPayload
45
51
  from ksadk.kernel.errors import UnsupportedControlError
46
52
  from ksadk.runtime import (
47
53
  BaseRuntime,
@@ -63,16 +69,7 @@ class ManagedHarnessRuntime(BaseRuntime):
63
69
  self._durable = durable
64
70
 
65
71
  def native_capabilities(self) -> dict[str, Any]:
66
- return {
67
- "cancel": {"supported": True},
68
- "resume": {"supported": True},
69
- "checkpoint": {"supported": True, "granularity": "snapshot"},
70
- "session_continuity": {
71
- "durable": self._durable,
72
- "scope": "workspace" if self._durable else "process",
73
- },
74
- "progressive_disclosure": {"skill": True, "mcp": True},
75
- }
72
+ return managed_harness_native_capabilities(durable=self._durable)
76
73
 
77
74
 
78
75
  class ManagedHarnessRuntimeAdapter(RuntimeAdapter):
@@ -88,6 +85,7 @@ class ManagedHarnessRuntimeAdapter(RuntimeAdapter):
88
85
  durable: bool = False,
89
86
  shared_across_pods: bool = False,
90
87
  execution_policy_resolver: ExecutionPolicyResolver | None = None,
88
+ hooks: tuple | None = None,
91
89
  ) -> None:
92
90
  super().__init__(ManagedHarnessRuntime(durable=durable))
93
91
  self._spec = spec
@@ -100,6 +98,7 @@ class ManagedHarnessRuntimeAdapter(RuntimeAdapter):
100
98
  reasoner=reasoner,
101
99
  checkpointer=memory_checkpointer(),
102
100
  context_engine=HarnessContextEngine(),
101
+ **({"hooks": tuple(hooks)} if hooks else {}),
103
102
  )
104
103
  self._compiled: Any | None = None
105
104
  self._external_handles: dict[str, RunHandle] = {}
@@ -240,25 +239,67 @@ class ManagedHarnessRuntimeAdapter(RuntimeAdapter):
240
239
 
241
240
  async def _stream(self, handle: RunHandle) -> AsyncIterator[Any]:
242
241
  internal = self._internal_handle(handle)
243
- async for event in self._engine.stream(internal):
244
- rich = event.to_v2()
245
- if not rich.parent_run_id:
246
- terminal_status = {
247
- EventType.RUN_COMPLETED: "completed",
248
- EventType.RUN_FAILED: "failed",
249
- EventType.RUN_CANCELED: "canceled",
250
- }.get(rich.event_type)
251
- if terminal_status is not None:
252
- # A terminal checkpoint must not remain eligible for cold
253
- # attach. Persist before yielding so a consumer that stops
254
- # at the terminal event cannot leave a stale live handle.
255
- self._persist_durable_handle(
256
- handle,
257
- terminal_status,
258
- terminal=True,
259
- )
260
- for projected in _project_event(event):
261
- yield projected
242
+ while True:
243
+ run_completed = False
244
+ async for event in self._engine.stream(internal):
245
+ rich = event.to_v2()
246
+ if not rich.parent_run_id:
247
+ terminal_status = {
248
+ EventType.RUN_COMPLETED: "completed",
249
+ EventType.RUN_FAILED: "failed",
250
+ EventType.RUN_CANCELED: "canceled",
251
+ }.get(rich.event_type)
252
+ if terminal_status is not None:
253
+ # A terminal checkpoint must not remain eligible for cold
254
+ # attach. Persist before yielding so a consumer that stops
255
+ # at the terminal event cannot leave a stale live handle.
256
+ self._persist_durable_handle(
257
+ handle,
258
+ terminal_status,
259
+ terminal=True,
260
+ )
261
+ if rich.event_type == EventType.RUN_COMPLETED and not rich.parent_run_id:
262
+ run_completed = True
263
+ for projected in _project_event(event):
264
+ yield projected
265
+ if not run_completed:
266
+ return
267
+ # follow_up 语义:本次 Run 自然完成后,若旧 Run 排了尾随指令,
268
+ # 就在同一条 stream 上自动起下一个 Run(新 run_id),宿主无感知。
269
+ follow_text = self._engine.pop_follow_up(internal.run_id)
270
+ if follow_text is None:
271
+ return
272
+ external_current = handle
273
+ follow_request = StartRequest(
274
+ input=follow_text,
275
+ user_id=external_current.native_ref.get("user_id") or "unknown",
276
+ session_id=external_current.session_id,
277
+ agent_id=external_current.native_ref.get("agent_id"),
278
+ runtime_type="harness",
279
+ metadata={
280
+ "origin": "follow_up",
281
+ "follow_up_of": external_current.run_id,
282
+ },
283
+ )
284
+ external_current = await self.start(follow_request)
285
+ handle = external_current
286
+ internal = self._internal_handle(external_current)
287
+
288
+ async def steer(self, handle: RunHandle, text: Any) -> SteerReceipt:
289
+ """流式中投递纠偏指令(返回 engine 的 :class:`SteerReceipt`)。
290
+
291
+ 同时接受纯文本(adapter 直调)与 Kernel 的 SteerPayload 线格式
292
+ (worker 会把契约载荷原样交给 adapter)。
293
+ """
294
+ return self._engine.steer(
295
+ self._internal_handle(handle),
296
+ _steer_text(text),
297
+ allow_follow_up=not isinstance(text, SteerPayload),
298
+ )
299
+
300
+ async def follow_up(self, handle: RunHandle, text: Any) -> SteerReceipt:
301
+ """排队尾随指令:本次 Run 自然完成后自动续跑下一个 Run。"""
302
+ return self._engine.follow_up(self._internal_handle(handle), _steer_text(text))
262
303
 
263
304
  async def cancel(self, handle: RunHandle) -> CancelResult:
264
305
  result = await self._engine.cancel(self._internal_handle(handle))
@@ -282,6 +323,11 @@ class ManagedHarnessRuntimeAdapter(RuntimeAdapter):
282
323
  # string. Unknown/missing decisions never become an approval.
283
324
  normalized = {
284
325
  "approve": "approved",
326
+ # Preserve the wider scope. Collapsing this to ``approved``
327
+ # only released the current tool call, so every subsequent
328
+ # write prompted again despite the Studio action saying
329
+ # "本次会话允许".
330
+ "approve_session": "approved_session",
285
331
  "approved": "approved",
286
332
  "reject": "denied",
287
333
  "rejected": "denied",
@@ -341,6 +387,21 @@ class ManagedHarnessRuntimeAdapter(RuntimeAdapter):
341
387
  raise KeyError(f"unknown managed Harness run: {handle.run_id}") from None
342
388
 
343
389
 
390
+ def _final_item_id(run_id: str, rich: Any) -> str:
391
+ """Derive the final-answer message item id, turn-scoped when turn_id is present.
392
+
393
+ 会话串轮修复(交接记录 2026-09-22 §7):final item_id 之前只按 ``run_id``
394
+ 派生,同一 run 内多轮 final 撞到同一 item_id,历史/重放 final 遮蔽当前轮
395
+ 正确 final。引擎在 final-answer 的 TEXT_COMPLETED 与 RUN_COMPLETED payload
396
+ 里带上当前 ``turn_id`` 后,这里据此派生 turn 级身份;未带 turn_id 时回退到
397
+ 旧 run 级身份,保持不发 TURN_STARTED 的引擎/路径行为不回退。
398
+ """
399
+ turn_id = str(rich.payload.get("turn_id") or "").strip()
400
+ if turn_id:
401
+ return stable_item_id("ksadk", run_id, "turn", turn_id, "message", "final")
402
+ return stable_item_id("ksadk", run_id, "message", "final")
403
+
404
+
344
405
  def _project_event(event: HarnessEvent) -> list[Any]:
345
406
  """Project one rich Harness event to one or more canonical v2 events."""
346
407
 
@@ -348,17 +409,32 @@ def _project_event(event: HarnessEvent) -> list[Any]:
348
409
  native_run_id = str(rich.run_id or rich.invocation_id)
349
410
  run_id = str(rich.invocation_id if rich.parent_run_id else native_run_id)
350
411
  scope_id = stable_scope_id("ksadk", native_run_id, str(rich.scope_id or rich.agent_id))
412
+ source_metadata: dict[str, Any] = {
413
+ "native_event_type": rich.event_type,
414
+ "agent_id": rich.agent_id,
415
+ "session_id": rich.session_id,
416
+ **({"phase": rich.phase} if rich.phase else {}),
417
+ **({"parent_run_id": rich.parent_run_id} if rich.parent_run_id else {}),
418
+ }
419
+ # Keep comparison-grade lifecycle facts on the canonical envelope. These
420
+ # are identifiers/state, never model reasoning or tool input/output, so
421
+ # evaluation can count retries and subagents without parsing item content.
422
+ if rich.event_type == EventType.RUN_PROGRESS:
423
+ activity_kind = str(rich.payload.get("kind") or "").strip()
424
+ activity_call_id = str(rich.payload.get("call_id") or "").strip()
425
+ if activity_kind:
426
+ source_metadata["activity_kind"] = activity_kind
427
+ if activity_call_id:
428
+ source_metadata["activity_call_id"] = activity_call_id
429
+ elif rich.event_type == EventType.MODEL_CALL_FAILED:
430
+ failure_action = str(rich.payload.get("action") or "").strip()
431
+ if failure_action:
432
+ source_metadata["failure_action"] = failure_action
351
433
  source = SourceRef(
352
434
  framework="ksadk",
353
435
  native_event_id=rich.event_id,
354
436
  native_run_id=native_run_id,
355
- metadata={
356
- "native_event_type": rich.event_type,
357
- "agent_id": rich.agent_id,
358
- "session_id": rich.session_id,
359
- **({"phase": rich.phase} if rich.phase else {}),
360
- **({"parent_run_id": rich.parent_run_id} if rich.parent_run_id else {}),
361
- },
437
+ metadata=source_metadata,
362
438
  )
363
439
 
364
440
  def envelope(event_type: str, item_id: str, part_id: str, ordinal: int = 0) -> dict[str, Any]:
@@ -399,6 +475,20 @@ def _project_event(event: HarnessEvent) -> list[Any]:
399
475
  )
400
476
  ]
401
477
 
478
+ if str(rich.payload.get("purpose") or "") == "compaction" and rich.event_type in {
479
+ EventType.TEXT_DELTA,
480
+ EventType.TEXT_COMPLETED,
481
+ EventType.REASONING_DELTA,
482
+ EventType.REASONING_COMPLETED,
483
+ }:
484
+ # Context summaries use the normal reasoner so model lifecycle and
485
+ # usage remain auditable. Their text is internal working state: exposing
486
+ # it as a final answer lets an old turn overwrite the current turn in
487
+ # Studio, and can disclose content that was only meant for compaction.
488
+ return status_projection(
489
+ {"purpose": "compaction", "event_type": rich.event_type}
490
+ )
491
+
402
492
  run_item = stable_item_id("ksadk", run_id, "$run")
403
493
  payload = rich.payload
404
494
  if rich.parent_run_id and rich.event_type in {
@@ -411,7 +501,20 @@ def _project_event(event: HarnessEvent) -> list[Any]:
411
501
  if rich.event_type == EventType.RUN_STARTED:
412
502
  return [RunStarted(**envelope("run.started", run_item, "run"), status="running")]
413
503
  if rich.event_type == EventType.RUN_COMPLETED:
414
- message_id = stable_item_id("ksadk", run_id, "message", "final")
504
+ message_id = _final_item_id(run_id, rich)
505
+ control_reason = str(payload.get("control_reason") or "").strip()
506
+ if control_reason:
507
+ # A controller stop may preserve a useful partial answer, but it
508
+ # is not successful task completion. Surface it as interrupted
509
+ # so Studio cannot show "已完成" next to an answer that explicitly
510
+ # reports remaining failed tests.
511
+ return [
512
+ RunInterrupted(
513
+ **envelope("run.interrupted", run_item, "run"),
514
+ status="interrupted",
515
+ reason=control_reason,
516
+ )
517
+ ]
415
518
  return [
416
519
  RunCompleted(
417
520
  **envelope("run.completed", run_item, "run"),
@@ -420,13 +523,25 @@ def _project_event(event: HarnessEvent) -> list[Any]:
420
523
  )
421
524
  ]
422
525
  if rich.event_type == EventType.RUN_FAILED:
526
+ category = str(payload.get("error_category") or "").strip()
527
+ error_code = str(payload.get("error_code") or "").strip()
528
+ status_code = payload.get("status_code")
529
+ try:
530
+ status_code = int(status_code) if status_code is not None else None
531
+ except (TypeError, ValueError):
532
+ status_code = None
533
+ if not error_code and category == "rate_limit":
534
+ error_code = "MODEL_RATE_LIMITED"
535
+ message = str(payload.get("error") or "Managed Harness run failed")
536
+ if status_code is not None and f"HTTP {status_code}" not in message:
537
+ message = f"HTTP {status_code} {message}"
423
538
  return [
424
539
  RunFailed(
425
540
  **envelope("run.failed", run_item, "run"),
426
541
  status="failed",
427
542
  error=ErrorInfo(
428
- code="HARNESS_EXECUTION_FAILED",
429
- message=str(payload.get("error") or "Managed Harness run failed"),
543
+ code=error_code or "HARNESS_EXECUTION_FAILED",
544
+ message=message,
430
545
  source="ksadk.harness.managed",
431
546
  scope_id=scope_id,
432
547
  ),
@@ -453,6 +568,22 @@ def _project_event(event: HarnessEvent) -> list[Any]:
453
568
  ),
454
569
  )
455
570
  ]
571
+ if rich.event_type in {EventType.PUBLIC_SUMMARY_DELTA, EventType.PUBLIC_SUMMARY_COMPLETED}:
572
+ from ksadk.harness.tool_display import display_text
573
+
574
+ item_id = stable_item_id("ksadk", run_id, "public-summary", str(payload["summary_id"]))
575
+ text = display_text(payload.get("text"))
576
+ if rich.event_type == EventType.PUBLIC_SUMMARY_COMPLETED:
577
+ return [ItemCompleted(**envelope("item.completed", item_id, "summary"),
578
+ item_id=item_id, item_kind="reasoning",
579
+ snapshot=ContentSnapshot(parts=(TextContent(part_id="summary", text=text),)))]
580
+ if payload.get("summary_start") is True:
581
+ return [ItemStarted(**envelope("item.started", item_id, "summary"),
582
+ item_id=item_id, item_kind="reasoning", phase="commentary",
583
+ initial=ContentSnapshot(parts=(TextContent(part_id="summary", text=text),)))]
584
+ return [ItemUpdated(**envelope("item.updated", item_id, "summary"),
585
+ item_id=item_id, item_kind="reasoning", op="append",
586
+ update=TextContent(part_id="summary", text=text))]
456
587
  # Provider reasoning is retained as trace evidence but is not a stable or
457
588
  # user-oriented progress contract. Exposing every model turn creates noisy
458
589
  # "thought" cards and may reveal private reasoning. Chat progress comes
@@ -492,6 +623,11 @@ def _project_event(event: HarnessEvent) -> list[Any]:
492
623
  if payload.get("kind") in {"delegation.route", "subagent.event"}:
493
624
  return status_projection()
494
625
  kind = str(payload.get("kind") or "")
626
+ # Run-control guidance is an internal controller fact. A literal
627
+ # "执行进度:guidance" row is neither useful to a user nor natural
628
+ # language; retain it in the canonical trace only.
629
+ if kind == "run_control":
630
+ return status_projection()
495
631
  if kind == "provider.retry":
496
632
  return _public_activity_items(
497
633
  rich=rich,
@@ -563,6 +699,7 @@ def _project_event(event: HarnessEvent) -> list[Any]:
563
699
  total_tokens=input_tokens + output_tokens,
564
700
  cached_tokens=max(0, int(payload.get("cached_tokens") or 0)),
565
701
  reasoning_tokens=max(0, int(payload.get("reasoning_tokens") or 0)),
702
+ mode=str(payload.get("mode") or "delta"),
566
703
  )
567
704
  ]
568
705
  if rich.event_type == EventType.APPROVAL_REQUESTED:
@@ -583,7 +720,7 @@ def _project_event(event: HarnessEvent) -> list[Any]:
583
720
  kind = "message" if rich.event_type == EventType.TEXT_COMPLETED else "reasoning"
584
721
  phase = str(rich.phase or ("final_answer" if kind == "message" else "commentary"))
585
722
  item_id = (
586
- stable_item_id("ksadk", run_id, "message", "final")
723
+ _final_item_id(run_id, rich)
587
724
  if kind == "message" and phase == "final_answer"
588
725
  else stable_item_id("ksadk", run_id, kind, rich.event_id)
589
726
  )
@@ -618,7 +755,7 @@ def _project_event(event: HarnessEvent) -> list[Any]:
618
755
  kind = "message" if rich.event_type == EventType.TEXT_DELTA else "reasoning"
619
756
  phase = str(rich.phase or ("final_answer" if kind == "message" else "commentary"))
620
757
  item_id = (
621
- stable_item_id("ksadk", native_run_id, "message", "final")
758
+ _final_item_id(native_run_id, rich)
622
759
  if kind == "message" and phase == "final_answer"
623
760
  else stable_item_id("ksadk", run_id, kind, "stream")
624
761
  )
@@ -644,21 +781,29 @@ def _project_event(event: HarnessEvent) -> list[Any]:
644
781
  update=update,
645
782
  )
646
783
  ]
647
- if rich.event_type in {EventType.TOOL_CALL_BEGIN, EventType.TOOL_CALL_END}:
784
+ if rich.event_type in {
785
+ EventType.TOOL_CALL_BEGIN, EventType.TOOL_CALL_END, EventType.TOOL_OUTPUT_UPDATED,
786
+ }:
648
787
  # Arguments, results and receipts remain in the canonical Trace. The
649
788
  # conversation receives the corresponding human-readable tool.batch
650
789
  # progress item, avoiding duplicate technical cards and configuration-
651
790
  # shaped payloads in the user-facing activity stream.
652
791
  action = tool_public_action(payload)
792
+ display = (safe_tool_display(payload.get("public_display"))
793
+ or tool_display_start(str(payload.get("name") or "tool"), payload.get("args")))
653
794
  return status_projection(
654
795
  {
655
796
  "name": str(payload.get("name") or "tool"),
656
797
  "call_id": str(payload.get("call_id") or rich.event_id),
657
798
  **({"public_action": action} if action else {}),
799
+ "tool_display": display,
658
800
  "status": (
659
801
  "started"
660
- if rich.event_type == EventType.TOOL_CALL_BEGIN
661
- else "failed" if payload.get("error") else "completed"
802
+ if rich.event_type in {EventType.TOOL_CALL_BEGIN, EventType.TOOL_OUTPUT_UPDATED}
803
+ else "failed" if payload.get("error") or (
804
+ isinstance(payload.get("result"), dict)
805
+ and payload["result"].get("ok") is False
806
+ ) else "completed"
662
807
  ),
663
808
  }
664
809
  )
@@ -681,21 +826,38 @@ def _public_activity_items(
681
826
  item_kind: str = "message",
682
827
  existing: bool = False,
683
828
  ) -> list[Any]:
684
- """Build one identity-stable, replaceable public activity item."""
829
+ """Build one identity-stable public activity lifecycle transition.
830
+
831
+ Each Harness event must project to exactly one renderer mutation. Emitting
832
+ ``started`` + identical ``updated`` + identical ``completed`` for a single
833
+ retry made clients that preserve canonical lifecycle events render the same
834
+ sentence twice. Running activities start once, subsequent progress replaces
835
+ once, and completion supplies the authoritative final snapshot once.
836
+ """
685
837
  del rich, scope_id, source
686
838
  item_id = stable_item_id("ksadk", run_id, item_kind, f"activity-{key}")
687
839
  part_id = "text-0"
688
840
  snapshot = ContentSnapshot(parts=(TextContent(part_id=part_id, text=summary),))
689
- events: list[Any] = []
841
+ if completed:
842
+ return [
843
+ ItemCompleted(
844
+ **envelope("item.completed", item_id, part_id, 2),
845
+ item_id=item_id,
846
+ item_kind=item_kind,
847
+ snapshot=snapshot,
848
+ )
849
+ ]
690
850
  if not existing:
691
- events.append(ItemStarted(
851
+ return [
852
+ ItemStarted(
692
853
  **envelope("item.started", item_id, part_id, 0),
693
854
  item_id=item_id,
694
855
  item_kind=item_kind,
695
856
  phase="commentary",
696
857
  initial=snapshot,
697
- ))
698
- events.append(
858
+ )
859
+ ]
860
+ return [
699
861
  ItemUpdated(
700
862
  **envelope("item.updated", item_id, part_id, 1),
701
863
  item_id=item_id,
@@ -703,17 +865,7 @@ def _public_activity_items(
703
865
  op="replace",
704
866
  update=TextContent(part_id=part_id, text=summary),
705
867
  )
706
- )
707
- if completed:
708
- events.append(
709
- ItemCompleted(
710
- **envelope("item.completed", item_id, part_id, 2),
711
- item_id=item_id,
712
- item_kind=item_kind,
713
- snapshot=snapshot,
714
- )
715
- )
716
- return events
868
+ ]
717
869
 
718
870
 
719
871
  def _progress_text(payload: dict[str, Any]) -> str:
@@ -778,12 +930,41 @@ def _provider_retry_text(payload: dict[str, Any]) -> str:
778
930
  attempt = max(2, int(payload["next_attempt"]))
779
931
  else:
780
932
  attempt = max(2, int(payload.get("model_attempt") or 1) + 1)
781
- maximum = max(attempt, int(payload.get("max_attempts") or 10))
933
+ maximum = max(attempt, int(payload.get("max_attempts") or 3))
782
934
  delay_ms = max(0, int(payload.get("delay_ms") or payload.get("retry_delay_ms") or 0))
783
935
  wait = f",{delay_ms / 1000:g} 秒后" if delay_ms else ""
784
936
  label = str(payload.get("label") or "").strip()
785
937
  scope = f"({label})" if label else ""
786
- return f"模型服务繁忙{scope}{wait}自动重试(第 {attempt}/{maximum} 次)"
938
+ # 叙述必须区分"上游繁忙/限流"与"其它失败":把被我们拒绝的响应说成
939
+ # "模型服务繁忙"会掩盖 bug(2026-09-18 实测事故)。
940
+ #
941
+ # 并且**类别本身也必须显示出来**:`transient` 里包含 `timeout`,而超时可能
942
+ # 是我们自己触发的(例如空闲进度超时)。统一写成"模型服务繁忙"会让用户
943
+ # 无法判断是网关的问题还是我们的问题——2026-09-18 用户直接质疑"服务器没
944
+ # 那么容易繁忙吧",而我们当时确实拿不出证据。这里保留可读措辞并附上原始
945
+ # 类别,让重试原因可辨。
946
+ category = str(payload.get("failure_category") or "").strip().lower()
947
+ transient = {"rate_limit", "timeout", "unavailable", "transport"}
948
+ # 类别未知时保持原措辞(不改变既有语义);只有确实拿到类别才改口径并附上。
949
+ headline = (
950
+ "模型调用未成功"
951
+ if category and category not in transient
952
+ else "模型服务繁忙"
953
+ )
954
+ if category:
955
+ headline = f"{headline}({category})"
956
+ # 附带上游 HTTP 状态码(纯数字,不含正文,无泄密风险)。2026-09-18 实测:
957
+ # 重试全是 `unavailable`,但它既可能是网关 503,也可能是**我们自己**把
958
+ # "网关 400(例如拒绝请求体某字段)"包装成 MODEL_REQUEST_FAILED(502)。
959
+ # 不显示状态码就无法区分"上游真的不可用"和"我们的请求把上游惹了"。
960
+ status_code = payload.get("status_code")
961
+ if status_code:
962
+ headline = f"{headline}[{status_code}]"
963
+ # 带上内部错误码(是我们自判失败还是上游失败,一眼可辨;不含任何正文/凭证)。
964
+ error_code = str(payload.get("error_code") or "").strip()
965
+ if error_code:
966
+ headline = f"{headline}<{error_code}>"
967
+ return f"{headline}{scope}{wait}自动重试(第 {attempt}/{maximum} 次)"
787
968
 
788
969
 
789
970
  def _public_approval_detail(value: Any) -> dict[str, Any]:
@@ -838,6 +1019,16 @@ def _compact_responsibilities(labels: list[str], *, max_items: int = 4) -> str:
838
1019
  return "\n" + "\n".join(lines)
839
1020
 
840
1021
 
1022
+ def _steer_text(value: Any) -> str:
1023
+ """Normalize both plain text and the Kernel wire payload to steering text."""
1024
+ if isinstance(value, str):
1025
+ return value
1026
+ content = getattr(value, "content", None)
1027
+ if content is None and isinstance(value, dict):
1028
+ content = value.get("content")
1029
+ return str(content) if content is not None else str(value)
1030
+
1031
+
841
1032
  def _positive_int(value: Any) -> int | None:
842
1033
  try:
843
1034
  parsed = int(value)
@@ -846,37 +1037,6 @@ def _positive_int(value: Any) -> int | None:
846
1037
  return parsed if parsed > 0 else None
847
1038
 
848
1039
 
849
- def managed_harness_capabilities(
850
- *, durable: bool, execution_policy: bool = False
851
- ) -> RuntimeCapabilityMatrix:
852
- """Return the canonical control matrix for one concrete assembly tier."""
853
-
854
- def available() -> RuntimeCapability:
855
- return RuntimeCapability(supported=True, mode="native")
856
-
857
- def unavailable(reason: str) -> RuntimeCapability:
858
- return RuntimeCapability(supported=False, mode="unavailable", reason=reason)
859
-
860
- durable_capability = (
861
- available() if durable else unavailable("managed_harness_checkpoint_is_process_local")
862
- )
863
- return RuntimeCapabilityMatrix(
864
- cancel=available(),
865
- pause=unavailable("managed_harness_pause_not_implemented"),
866
- resume=available(),
867
- submit_interaction=durable_capability,
868
- attach=durable_capability,
869
- steer=unavailable("runtime_no_native_steer"),
870
- inject=unavailable("runtime_no_native_inject"),
871
- checkpoint=available(),
872
- durable_restore=durable_capability,
873
- interaction_mode="durable_resume" if durable else "unavailable",
874
- execution_policy=(
875
- available() if execution_policy else unavailable("managed_harness_no_host_resolver")
876
- ),
877
- )
878
-
879
-
880
1040
  __all__ = [
881
1041
  "ManagedHarnessRuntime",
882
1042
  "ManagedHarnessRuntimeAdapter",
@@ -0,0 +1,85 @@
1
+ """Framework-free L0-L3 MCP tool contract shared by runtime implementations."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from typing import Any
7
+
8
+ MCP_LIST_TOOLS_TOOL = "mcp_list_tools"
9
+ MCP_READ_SCHEMA_TOOL = "mcp_read_tool_schema"
10
+ MCP_CALL_TOOL_TOOL = "mcp_call_tool"
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class McpDisclosureToolSpec:
15
+ """暴露给模型的受控 MCP 披露工具描述。"""
16
+
17
+ name: str
18
+ description: str
19
+ parameters: dict[str, Any]
20
+
21
+ @property
22
+ def openai_schema(self) -> dict[str, Any]:
23
+ return {
24
+ "type": "function",
25
+ "function": {
26
+ "name": self.name,
27
+ "description": self.description,
28
+ "parameters": self.parameters,
29
+ },
30
+ }
31
+
32
+
33
+ def disclosure_tools() -> list[McpDisclosureToolSpec]:
34
+ server_id = {"type": "string", "description": "Revision 已绑定的 MCP Server 引用。"}
35
+ tool_name = {"type": "string", "description": "该 Server 上的 Tool 名。"}
36
+ return [
37
+ McpDisclosureToolSpec(
38
+ name=MCP_LIST_TOOLS_TOOL,
39
+ description=(
40
+ "列出指定 MCP Server 的可用 Tool(名称与一句话描述,不含参数 Schema)。"
41
+ "使用该 Server 的任何 Tool 前必须先调用此工具。refresh=true 时刷新缓存。"
42
+ ),
43
+ parameters={
44
+ "type": "object",
45
+ "properties": {
46
+ "server_id": server_id,
47
+ "refresh": {"type": "boolean", "description": "失效并重新拉取工具列表"},
48
+ },
49
+ "required": ["server_id"],
50
+ "additionalProperties": False,
51
+ },
52
+ ),
53
+ McpDisclosureToolSpec(
54
+ name=MCP_READ_SCHEMA_TOOL,
55
+ description=(
56
+ "读取指定 Tool 的完整输入参数 Schema。必须先 mcp_list_tools 该 Server,"
57
+ "且调用任何 Tool 前必须先读其 Schema。"
58
+ ),
59
+ parameters={
60
+ "type": "object",
61
+ "properties": {"server_id": server_id, "tool_name": tool_name},
62
+ "required": ["server_id", "tool_name"],
63
+ "additionalProperties": False,
64
+ },
65
+ ),
66
+ McpDisclosureToolSpec(
67
+ name=MCP_CALL_TOOL_TOOL,
68
+ description=(
69
+ "调用指定 MCP Tool。必须先用 mcp_read_tool_schema 读取该 Tool 的 Schema。"
70
+ ),
71
+ parameters={
72
+ "type": "object",
73
+ "properties": {
74
+ "server_id": server_id,
75
+ "tool_name": tool_name,
76
+ "arguments": {
77
+ "type": "object",
78
+ "description": "按 Schema 组装的工具参数。",
79
+ },
80
+ },
81
+ "required": ["server_id", "tool_name", "arguments"],
82
+ "additionalProperties": False,
83
+ },
84
+ ),
85
+ ]
@@ -0,0 +1,44 @@
1
+ """Framework-free MCP result disclosure policy shared by managed runtimes."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import re
6
+ from dataclasses import dataclass
7
+
8
+ #: 平台托管 Runtime 的基础敏感数据默认规则(组织可覆盖或接 DLP):
9
+ #: 中国大陆身份证号 / 16-19 位银行卡号 / 1[3-9] 开头手机号。
10
+ _DEFAULT_SENSITIVE_PATTERNS = (
11
+ # A long fractional component (for example a vector-search score such as
12
+ # ``0.9619389772415161``) is not an identity or payment-card number. The
13
+ # previous word-boundary patterns started matching immediately after the
14
+ # decimal point and offloaded otherwise harmless MCP results with an empty
15
+ # summary, leaving the model unable to read knowledge-base results.
16
+ r"(?<![\d.])\d{17}[\dXx](?![\d.])",
17
+ r"(?<![\d.])\d{16,19}(?![\d.])",
18
+ r"(?<![\d.])1[3-9]\d{9}(?![\d.])",
19
+ )
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class McpOffloadPolicy:
24
+ """P1 大结果 Offload 策略。
25
+
26
+ - ``single_result_threshold_bytes``:单次工具结果超过该字节数 → 外置;
27
+ - ``sensitive_patterns``:命中任一正则 → 无论大小强制外置,且摘要置空
28
+ (敏感明文不留在 Context)。默认开启平台基础规则(身份证/银行卡/
29
+ 手机号),组织可通过自定义 policy 覆盖或接入 DLP/分类服务;
30
+ - ``run_total_quota_bytes``:Run 累计外置字节配额,超出后新的超大结果
31
+ 明确报错降级(不回填 Context)。
32
+ """
33
+
34
+ enabled: bool = True
35
+ single_result_threshold_bytes: int = 4096
36
+ run_total_quota_bytes: int = 10 * 1024 * 1024
37
+ summary_chars: int = 500
38
+ sensitive_patterns: tuple[str, ...] = _DEFAULT_SENSITIVE_PATTERNS
39
+
40
+ def sensitive_match(self, content: str) -> str | None:
41
+ for pattern in self.sensitive_patterns:
42
+ if re.search(pattern, content):
43
+ return pattern
44
+ return None