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
ksadk/api/client.py CHANGED
@@ -23,6 +23,9 @@ import urllib3
23
23
 
24
24
  from ksadk.api.environment import environment_variables_payload
25
25
  from ksadk.common.auth import AWSV4Auth
26
+ from ksadk.common.cloud_headers import build_cloud_headers
27
+
28
+ from ksadk.api.sse_stream import AgentEngineSSEStream, _next_stream_chunk
26
29
 
27
30
  logger = logging.getLogger(__name__)
28
31
 
@@ -37,69 +40,6 @@ class AttachmentContent:
37
40
  display_name: str
38
41
 
39
42
 
40
- def _next_stream_chunk(iterator: Iterator[bytes]) -> bytes | None:
41
- """Read one non-empty requests chunk without leaking StopIteration to asyncio."""
42
-
43
- while True:
44
- try:
45
- chunk = next(iterator)
46
- except StopIteration:
47
- return None
48
- if chunk:
49
- return chunk
50
-
51
-
52
- class AgentEngineSSEStream(AsyncIterator[bytes]):
53
- """Async owner for one dedicated blocking requests SSE connection."""
54
-
55
- def __init__(self, response: requests.Response, session: requests.Session) -> None:
56
- self._response: requests.Response | None = response
57
- self._session: requests.Session | None = session
58
- # Read SSE as logical lines with the smallest requests read size. A
59
- # fixed 8 KiB ``iter_content`` block makes short runs appear
60
- # non-streaming, while ``chunk_size=None`` waits for EOF on urllib3.
61
- # ``iter_lines`` performs the byte-at-a-time buffering inside the
62
- # blocking worker and yields complete lines, avoiding one thread hop
63
- # per byte. Re-add the delimiter so downstream SSE parsers keep their
64
- # normal framing, including the blank line between events.
65
- self._chunks = (line + b"\n" for line in response.iter_lines(chunk_size=1))
66
- self._closed = False
67
-
68
- def __aiter__(self) -> "AgentEngineSSEStream":
69
- return self
70
-
71
- async def __anext__(self) -> bytes:
72
- if self._closed:
73
- raise StopAsyncIteration
74
- try:
75
- chunk = await asyncio.to_thread(_next_stream_chunk, self._chunks)
76
- except BaseException:
77
- await self.aclose()
78
- raise
79
- if chunk is None:
80
- await self.aclose()
81
- raise StopAsyncIteration
82
- return chunk
83
-
84
- async def aclose(self) -> None:
85
- if self._closed:
86
- return
87
- self._closed = True
88
- response, session = self._response, self._session
89
- self._response = None
90
- self._session = None
91
-
92
- def close_transport() -> None:
93
- try:
94
- if response is not None:
95
- response.close()
96
- finally:
97
- if session is not None:
98
- session.close()
99
-
100
- await asyncio.to_thread(close_transport)
101
-
102
-
103
43
  class DryRunExit(Exception):
104
44
  """DryRun 模式退出异常。"""
105
45
 
@@ -590,7 +530,7 @@ class AgentEngineClient:
590
530
  account_id = self._resolve_account_id()
591
531
  if account_id:
592
532
  headers["X-Ksc-Account-Id"] = account_id
593
- return headers
533
+ return build_cloud_headers(headers)
594
534
 
595
535
  def _resolve_user_uuid(self) -> Optional[str]:
596
536
  """解析子账号 user uuid(X-Ksc-User-uuid 值)。
@@ -1055,7 +995,7 @@ class AgentEngineClient:
1055
995
  response = self._get_session().request(
1056
996
  method="POST",
1057
997
  url=f"{endpoint}/agentengine/api/v1/{action}",
1058
- headers={"Authorization": f"Bearer {api_key}"},
998
+ headers=build_cloud_headers({"Authorization": f"Bearer {api_key}"}),
1059
999
  json=params,
1060
1000
  timeout=self.timeout,
1061
1001
  verify=self._request_ssl_verify(),
@@ -1246,7 +1186,7 @@ class AgentEngineClient:
1246
1186
  response = self._get_session().request(
1247
1187
  method=method,
1248
1188
  url=url,
1249
- headers=headers or None,
1189
+ headers=build_cloud_headers(headers),
1250
1190
  params=params,
1251
1191
  files=files,
1252
1192
  stream=False,
@@ -1313,6 +1253,7 @@ class AgentEngineClient:
1313
1253
  params: Optional[Dict[str, Any]] = None,
1314
1254
  *,
1315
1255
  ignore_dry_run: bool = False,
1256
+ preserve_case: bool = False,
1316
1257
  ) -> Dict[str, Any]:
1317
1258
  """通用 Action API 调用"""
1318
1259
  body = params or {}
@@ -1336,7 +1277,7 @@ class AgentEngineClient:
1336
1277
 
1337
1278
  # 提取 Data 并统一转换为 snake_case
1338
1279
  data = result.get("Data") if result.get("Data") is not None else result
1339
- data = self._to_snake_case(data)
1280
+ data = data if preserve_case else self._to_snake_case(data)
1340
1281
 
1341
1282
  # 预发环境 endpoint 协议归一化: https -> http
1342
1283
  if self.logical_region and self.logical_region.strip().lower() == "pre-online":
@@ -1584,6 +1525,7 @@ class AgentEngineClient:
1584
1525
  "Bucket": ks3.get("bucket"),
1585
1526
  "Command": data.get("code_command"),
1586
1527
  "Checksum": data.get("code_checksum"),
1528
+ "AgentKernelContractDigest": data.get("agent_kernel_contract_digest"),
1587
1529
  }
1588
1530
  elif params["DeploymentType"] == "ManagedRuntime":
1589
1531
  params["ManagedRuntimeConfig"] = self._managed_runtime_config_payload(data)
@@ -1888,7 +1830,7 @@ class AgentEngineClient:
1888
1830
  return True
1889
1831
 
1890
1832
  async def update_agent(self, agent_id: str, data: Dict[str, Any]) -> Dict[str, Any]:
1891
- """更新 Agent (热更新)"""
1833
+ """提交 Agent 更新并直接返回响应;Code 更新由服务端后台执行。"""
1892
1834
  params: Dict[str, Any] = {"AgentId": agent_id}
1893
1835
  artifact_type = data.get("artifact_type")
1894
1836
  if artifact_type:
@@ -1916,6 +1858,7 @@ class AgentEngineClient:
1916
1858
  "Bucket": ks3.get("bucket"),
1917
1859
  "Command": data.get("code_command"),
1918
1860
  "Checksum": data.get("code_checksum"),
1861
+ "AgentKernelContractDigest": data.get("agent_kernel_contract_digest"),
1919
1862
  }
1920
1863
 
1921
1864
  if data.get("resources"):
@@ -1933,7 +1876,14 @@ class AgentEngineClient:
1933
1876
 
1934
1877
  envs = data.get("env_vars") or data.get("environment_variables")
1935
1878
  if envs:
1936
- params["EnvironmentVariables"] = environment_variables_payload(envs)
1879
+ env_payload = environment_variables_payload(envs)
1880
+ if data.get("environment_variables_is_patch"):
1881
+ params["EnvironmentVariablePatch"] = {
1882
+ "Upsert": env_payload,
1883
+ "Delete": [],
1884
+ }
1885
+ else:
1886
+ params["EnvironmentVariables"] = env_payload
1937
1887
 
1938
1888
  network_payload = self._normalize_network_payload(data.get("network"))
1939
1889
  if network_payload:
@@ -1978,7 +1928,7 @@ class AgentEngineClient:
1978
1928
  if advanced:
1979
1929
  params["Advanced"] = advanced
1980
1930
 
1981
- return self._action("UpdateAgent", params)
1931
+ return await self._action_async("UpdateAgent", params)
1982
1932
 
1983
1933
  # ===== Session Actions =====
1984
1934
 
@@ -2593,16 +2543,18 @@ class AgentEngineClient:
2593
2543
  params["Metadata"] = {"agentengine": execution_metadata}
2594
2544
  return await self._action_async("RunAgent", params)
2595
2545
 
2596
- def _open_chat_stream(self, params: Dict[str, Any]) -> AgentEngineSSEStream:
2546
+ def _open_chat_stream(
2547
+ self, params: Dict[str, Any], *, action: str = "RunAgent", method: str = "POST"
2548
+ ) -> AgentEngineSSEStream:
2597
2549
  """Open RunAgent SSE synchronously in a worker-owned requests session."""
2598
2550
 
2599
- path = "/agentengine/api/v1/RunAgent"
2600
- _kop_mode, headers, full_url = self._build_action_request_target(path, "RunAgent")
2551
+ path = f"/agentengine/api/v1/{action}"
2552
+ _kop_mode, headers, full_url = self._build_action_request_target(path, action)
2601
2553
  body_str = json.dumps(params, ensure_ascii=False)
2602
2554
  if self.dry_run:
2603
2555
  # Reuse the established dry-run contract, which raises DryRunExit
2604
2556
  # with the signed request rather than opening a socket.
2605
- self._request("POST", path, params)
2557
+ self._request(method, path, params)
2606
2558
  raise AssertionError("dry-run request unexpectedly returned")
2607
2559
 
2608
2560
  session = requests.Session()
@@ -2612,9 +2564,10 @@ class AgentEngineClient:
2612
2564
  try:
2613
2565
  while True:
2614
2566
  response = session.request(
2615
- method="POST",
2567
+ method=method,
2616
2568
  url=full_url,
2617
- data=body_str.encode("utf-8"),
2569
+ data=body_str.encode("utf-8") if method == "POST" else None,
2570
+ params=params if method == "GET" else None,
2618
2571
  headers=headers,
2619
2572
  auth=self._auth.get_auth(),
2620
2573
  # A foreground Agent turn can legitimately spend minutes
@@ -2650,7 +2603,7 @@ class AgentEngineClient:
2650
2603
  str(
2651
2604
  details.get("remote_error_message") or details.get("message") or ""
2652
2605
  ).strip()
2653
- or "RunAgent stream did not return text/event-stream"
2606
+ or f"{action} stream did not return text/event-stream"
2654
2607
  )
2655
2608
  raise AgentEngineAPIError(
2656
2609
  error_code,
@@ -2663,12 +2616,12 @@ class AgentEngineClient:
2663
2616
  response = None
2664
2617
  self._switch_to_inner_aicp_endpoint()
2665
2618
  _kop_mode, headers, full_url = self._build_action_request_target(
2666
- path, "RunAgent"
2619
+ path, action
2667
2620
  )
2668
2621
  continue
2669
2622
 
2670
2623
  self._log_http_error(
2671
- method="POST",
2624
+ method=method,
2672
2625
  full_url=full_url,
2673
2626
  status_code=response.status_code,
2674
2627
  details=details,
@@ -0,0 +1,96 @@
1
+ """Own a cancellable blocking HTTP SSE connection from asyncio."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import socket
7
+ from typing import AsyncIterator, Iterator
8
+
9
+ import requests
10
+
11
+
12
+ def _next_stream_chunk(iterator: Iterator[bytes]) -> bytes | None:
13
+ """Read one non-empty requests chunk without leaking StopIteration to asyncio."""
14
+
15
+ while True:
16
+ try:
17
+ chunk = next(iterator)
18
+ except StopIteration:
19
+ return None
20
+ if chunk:
21
+ return chunk
22
+
23
+
24
+ class AgentEngineSSEStream(AsyncIterator[bytes]):
25
+ """Async owner for one dedicated blocking requests SSE connection."""
26
+
27
+ def __init__(self, response: requests.Response, session: requests.Session) -> None:
28
+ self._response: requests.Response | None = response
29
+ self._session: requests.Session | None = session
30
+ # Read SSE as logical lines with the smallest requests read size. A
31
+ # fixed 8 KiB ``iter_content`` block makes short runs appear
32
+ # non-streaming, while ``chunk_size=None`` waits for EOF on urllib3.
33
+ # ``iter_lines`` performs the byte-at-a-time buffering inside the
34
+ # blocking worker and yields complete lines, avoiding one thread hop
35
+ # per byte. Re-add the delimiter so downstream SSE parsers keep their
36
+ # normal framing, including the blank line between events.
37
+ self._chunks = (line + b"\n" for line in response.iter_lines(chunk_size=1))
38
+ self._closed = False
39
+ # requests/urllib3 close() waits for the buffered reader's lock. A
40
+ # worker blocked in an unlimited SSE read holds that lock, so closing
41
+ # from another thread must first wake the socket. Capture it before
42
+ # EOF can clear urllib3's connection reference. Connection: close
43
+ # responses may only retain it through HTTPResponse's buffered file.
44
+ raw = getattr(response, "raw", None)
45
+ connection = getattr(raw, "_connection", None)
46
+ transport_socket = getattr(connection, "sock", None)
47
+ if not isinstance(transport_socket, socket.socket):
48
+ response_file = getattr(getattr(raw, "_fp", None), "fp", None)
49
+ transport_socket = getattr(getattr(response_file, "raw", None), "_sock", None)
50
+ self._socket = transport_socket if isinstance(transport_socket, socket.socket) else None
51
+
52
+ def __aiter__(self) -> "AgentEngineSSEStream":
53
+ return self
54
+
55
+ async def __anext__(self) -> bytes:
56
+ if self._closed:
57
+ raise StopAsyncIteration
58
+ try:
59
+ chunk = await asyncio.to_thread(_next_stream_chunk, self._chunks)
60
+ except Exception:
61
+ if self._closed:
62
+ raise StopAsyncIteration from None
63
+ await self.aclose()
64
+ raise
65
+ except BaseException:
66
+ await self.aclose()
67
+ raise
68
+ if chunk is None or self._closed:
69
+ await self.aclose()
70
+ raise StopAsyncIteration
71
+ return chunk
72
+
73
+ async def aclose(self) -> None:
74
+ if self._closed:
75
+ return
76
+ self._closed = True
77
+ response, session = self._response, self._session
78
+ self._response = None
79
+ self._session = None
80
+ transport_socket, self._socket = self._socket, None
81
+
82
+ def close_transport() -> None:
83
+ try:
84
+ if transport_socket is not None:
85
+ try:
86
+ transport_socket.shutdown(socket.SHUT_RDWR)
87
+ except OSError:
88
+ # EOF or a simultaneous peer disconnect already closed it.
89
+ pass
90
+ if response is not None:
91
+ response.close()
92
+ finally:
93
+ if session is not None:
94
+ session.close()
95
+
96
+ await asyncio.to_thread(close_transport)
@@ -41,8 +41,46 @@ from ksadk.builders.requirements_utils import (
41
41
  parse_requirements_text,
42
42
  )
43
43
 
44
+ from ksadk.builders.source_provenance import _git_provenance, _package_provenance as _read_package_provenance
45
+
46
+
47
+ def _package_provenance(package_name: str, package_root: Path) -> dict:
48
+ return _read_package_provenance(package_name, package_root, git_reader=_git_provenance)
49
+
44
50
  BUILD_INFO_SCHEMA = "ksadk-build-info/v1"
45
51
  BUILD_INFO_ARCNAME = "ksadk/BUILD-INFO.json"
52
+ DEPLOYMENT_CONTRACT_ARCNAME = "ksadk/DEPLOYMENT-CONTRACT.json"
53
+ HOSTED_CODE_COMMAND = [
54
+ "ksadk", "web", "/app/code", "--port", "8080", "--host", "0.0.0.0", "--no-open",
55
+ ]
56
+
57
+
58
+ def read_code_deployment_contract(zip_path: Path) -> dict[str, Any] | None:
59
+ """Read the declaration from this exact built ZIP; never infer it from the caller's SDK."""
60
+ try:
61
+ with zipfile.ZipFile(zip_path) as archive:
62
+ return json.loads(archive.read(DEPLOYMENT_CONTRACT_ARCNAME))
63
+ except (OSError, KeyError, ValueError, zipfile.BadZipFile):
64
+ return None
65
+
66
+
67
+ def _bundled_kernel_contract_digest(files) -> str | None:
68
+ for package_name, relative, file_path in files:
69
+ if package_name != "ksadk" or relative != "kernel/contract_fingerprints.py":
70
+ continue
71
+ try:
72
+ tree = ast.parse(file_path.read_text(encoding="utf-8"))
73
+ for node in tree.body:
74
+ if isinstance(node, ast.Assign) and any(
75
+ isinstance(target, ast.Name) and target.id == "AGENT_KERNEL_V1_AGGREGATE_DIGEST"
76
+ for target in node.targets
77
+ ):
78
+ value = ast.literal_eval(node.value)
79
+ if isinstance(value, str) and re.fullmatch(r"[0-9a-f]{64}", value):
80
+ return value
81
+ except (OSError, SyntaxError, ValueError, TypeError):
82
+ return None
83
+ return None
46
84
 
47
85
 
48
86
  def _sha256_file(path: Path) -> str:
@@ -70,84 +108,6 @@ def _bundled_content_fingerprint(files: List[Any]) -> str:
70
108
  return digest.hexdigest()
71
109
 
72
110
 
73
- def _git_provenance(start: Path) -> Optional[dict]:
74
- """返回 start 所在 git 仓库的提交信息;非 git 目录返回 None。"""
75
-
76
- def _git(*args: str) -> Optional[str]:
77
- try:
78
- proc = subprocess.run(
79
- ["git", "-C", str(start), *args],
80
- capture_output=True,
81
- text=True,
82
- timeout=10,
83
- )
84
- except Exception:
85
- return None
86
- if proc.returncode != 0:
87
- return None
88
- return proc.stdout.strip()
89
-
90
- toplevel = _git("rev-parse", "--show-toplevel")
91
- if not toplevel:
92
- return None
93
- commit = _git("rev-parse", "HEAD")
94
- branch = _git("rev-parse", "--abbrev-ref", "HEAD")
95
- status = _git("status", "--porcelain")
96
- return {
97
- "repo_root": toplevel,
98
- "commit": commit,
99
- "branch": branch or None,
100
- "dirty": bool(status),
101
- }
102
-
103
-
104
- def _package_provenance(package_name: str, package_root: Path) -> dict:
105
- """采集被 vendored 包的安装来源:dist 元信息 / 本地路径 / git 提交。"""
106
-
107
- info: dict[str, Any] = {
108
- "source_dir": str(package_root),
109
- "dist_version": None,
110
- "installer": None,
111
- "direct_url": None,
112
- "source_type": "unknown",
113
- "git": None,
114
- }
115
- try:
116
- dist = importlib_metadata.distribution(package_name)
117
- except Exception:
118
- dist = None
119
- if dist is not None:
120
- info["dist_version"] = dist.version
121
- installer = (dist.read_text("INSTALLER") or "").strip()
122
- info["installer"] = installer or None
123
- raw_direct_url = dist.read_text("direct_url.json")
124
- if raw_direct_url:
125
- try:
126
- direct_url = json.loads(raw_direct_url)
127
- except ValueError:
128
- direct_url = None
129
- if isinstance(direct_url, dict):
130
- info["direct_url"] = direct_url.get("url")
131
- url = str(direct_url.get("url") or "")
132
- dir_info = direct_url.get("dir_info") or {}
133
- archive_info = direct_url.get("archive_info") or {}
134
- if url.startswith("file://"):
135
- if dir_info.get("editable"):
136
- info["source_type"] = "editable-install"
137
- elif url.endswith(".whl"):
138
- info["source_type"] = "local-wheel"
139
- else:
140
- info["source_type"] = "local-path"
141
- elif archive_info:
142
- info["source_type"] = "remote-dist"
143
- if info["direct_url"] is None and info["dist_version"] is not None:
144
- # pip 从 index 安装的常规 dist 通常不写 direct_url.json
145
- info["source_type"] = "installed-dist"
146
- if info["source_type"] in {"editable-install", "local-path", "unknown"}:
147
- info["git"] = _git_provenance(package_root)
148
- return info
149
-
150
-
151
111
  def build_bundled_source_manifest(
152
112
  package_roots: dict,
153
113
  bundled_files: List[Any],
@@ -249,6 +209,7 @@ class CodeBuilder(BaseBuilder):
249
209
  ".yaml",
250
210
  ".yml",
251
211
  ".json",
212
+ ".sql",
252
213
  ".jinja2",
253
214
  ".j2",
254
215
  ".txt",
@@ -270,6 +231,9 @@ class CodeBuilder(BaseBuilder):
270
231
  }
271
232
  BUNDLED_KSADK_CORE_RUNTIME_REQUIREMENTS = (
272
233
  "a2a-sdk>=0.3.22",
234
+ # Code archives run `ksadk web` in the plain Runtime image as well as
235
+ # the Kernel Host image. ksadk.cli imports rich during startup.
236
+ "rich>=13.0.0",
273
237
  "culsans>=0.11.0",
274
238
  "httpx-sse>=0.4.0",
275
239
  "sse-starlette>=2.1.0",
@@ -281,8 +245,10 @@ class CodeBuilder(BaseBuilder):
281
245
  "requests-aws4auth>=1.2.0",
282
246
  "kingsoftcloud-sdk-python>=1.5.8.94",
283
247
  "cryptography>=44.0.0",
248
+ "rfc8785==0.1.4",
284
249
  "websockets>=12.0,<16.0",
285
250
  "qrcode>=7.4.0",
251
+ "rfc8785>=0.1.4",
286
252
  )
287
253
  BUNDLED_KSADK_MCP_RUNTIME_REQUIREMENTS = (
288
254
  "mcp>=1.1.0",
@@ -344,11 +310,17 @@ class CodeBuilder(BaseBuilder):
344
310
 
345
311
  def build(self) -> BuildResult:
346
312
  """执行 Code 模式构建"""
313
+ from ksadk.a2a.build_validation import validate_a2a_exposure_sources
347
314
  from ksadk.detection import FrameworkDetector
348
315
 
349
316
  self._load_dotenv()
350
317
  config = self._load_config()
351
318
 
319
+ try:
320
+ validate_a2a_exposure_sources(self.project_dir)
321
+ except ValueError as exc:
322
+ return BuildResult(success=False, error_message=str(exc))
323
+
352
324
  # 检测框架
353
325
  detector = FrameworkDetector(str(self.project_dir))
354
326
  detection_result = detector.detect()
@@ -891,7 +863,10 @@ class CodeBuilder(BaseBuilder):
891
863
 
892
864
  def _should_skip_ksadk_relative_path(self, relative_path: Path) -> bool:
893
865
  parts = relative_path.parts
894
- return len(parts) >= 2 and parts[0] == "server" and parts[1] == "web-ui"
866
+ return len(parts) >= 2 and parts[:2] in {
867
+ ("server", "web-ui"),
868
+ ("studio", "react-ui"),
869
+ }
895
870
 
896
871
  def _warn_on_nonrelease_bundled_source(self, build_info: dict) -> None:
897
872
  """vendored ksadk 源码来自本地路径/editable/来源不明时给出醒目提示。
@@ -1012,6 +987,13 @@ class CodeBuilder(BaseBuilder):
1012
987
  )
1013
988
  final_deps = merge_requirement_lists(final_deps, user_deps)
1014
989
 
990
+ # User pins may narrow the supported framework window, but an unpinned
991
+ # template dependency must not erase it. Keeping both requirements lets
992
+ # pip intersect constraints and reject incompatible pins at build time.
993
+ for requirement in code_requirements_for_framework(detection_result.type.value):
994
+ if requirement not in final_deps:
995
+ final_deps.append(requirement)
996
+
1015
997
  return final_deps
1016
998
 
1017
999
  def _bundled_ksadk_extra_requirements(self, requirements: List[str]) -> tuple[str, ...]:
@@ -1869,6 +1851,17 @@ class CodeBuilder(BaseBuilder):
1869
1851
  BUILD_INFO_ARCNAME,
1870
1852
  json.dumps(build_info, ensure_ascii=False, indent=2, sort_keys=True) + "\n",
1871
1853
  )
1854
+ zf.writestr(
1855
+ DEPLOYMENT_CONTRACT_ARCNAME,
1856
+ json.dumps({
1857
+ "schema": "ksadk-code-deployment/v1",
1858
+ "framework": detection_result.type.value,
1859
+ "command": HOSTED_CODE_COMMAND,
1860
+ "agentKernelContractDigest": _bundled_kernel_contract_digest(
1861
+ bundled_source_files
1862
+ ),
1863
+ }, sort_keys=True, separators=(",", ":")) + "\n",
1864
+ )
1872
1865
  self._warn_on_nonrelease_bundled_source(build_info)
1873
1866
 
1874
1867
  click.echo(f" ✓ 打包运行时源码: {bundled_source_count} 个文件")
@@ -2212,43 +2205,27 @@ runtime_context = RuntimeLaunchContext(
2212
2205
  detection=detection_result,
2213
2206
  config=dict(runtime_build_config),
2214
2207
  )
2215
- # managed A2A:KSADK_A2A_RUNTIME_ID 非空时挂 discovery card + 完整数据面 route。
2216
- _managed_a2a_card = None
2217
- _a2a_config = None
2208
+ # Runtime identity is available before registration for discovery. Operator
2209
+ # enables the complete composition only after every Secret projection exists.
2210
+ _managed_a2a_bootstrap = None
2218
2211
  _a2a_adapter = None
2219
2212
  if os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip():
2220
- from ksadk.managed_a2a_card import build_managed_a2a_card_if_configured
2221
-
2222
- _managed_a2a_card = build_managed_a2a_card_if_configured()
2223
- try:
2224
- from ksadk.a2a.routes import A2AConfig
2213
+ if os.environ.get("KSADK_A2A_MANAGED_BOOTSTRAP_ENABLED", "").strip().lower() == "true":
2214
+ from ksadk.a2a.platform import build_managed_a2a_bootstrap_from_env
2225
2215
  from ksadk.runtime.factory import create_runtime_adapter
2226
2216
 
2227
2217
  _a2a_adapter = create_runtime_adapter(runtime_context)
2228
- _base = (
2229
- os.environ.get("KSADK_A2A_INTERNAL_BASE_URL", "").strip()
2230
- or "http://localhost:8080"
2231
- )
2232
- _a2a_config = A2AConfig(
2233
- enabled=True,
2234
- base_url=_base,
2235
- agent_name=(
2236
- os.environ.get("KSADK_A2A_AGENT_NAME", "").strip()
2237
- or os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip()
2238
- ),
2239
- streaming=True,
2240
- task_store_dsn="sqlite+aiosqlite:///.agentengine/a2a_tasks.db",
2241
- )
2242
- except Exception as _e:
2243
- logger.warning(f"managed A2A 数据面装配失败,回退 discovery-only: {{_e}}")
2244
- _a2a_config = None
2245
- _a2a_adapter = None
2218
+ _managed_a2a_bootstrap = build_managed_a2a_bootstrap_from_env()
2219
+ else:
2220
+ from ksadk.managed_a2a_card import build_managed_a2a_card_if_configured
2221
+
2222
+ _managed_a2a_bootstrap = build_managed_a2a_card_if_configured()
2246
2223
  app = create_runtime_app(
2247
2224
  RuntimeAppConfig(
2248
2225
  runtime_type=detection_result.type.value,
2249
2226
  runtime_executor=RuntimeExecutor(build_default_runtime_registry()),
2250
2227
  launch_context=runtime_context,
2251
- a2a=_a2a_config or _managed_a2a_card,
2228
+ a2a=_managed_a2a_bootstrap,
2252
2229
  a2a_runtime_adapter=_a2a_adapter,
2253
2230
  ),
2254
2231
  configure_runtime_app,
@@ -561,45 +561,27 @@ runtime_context = RuntimeLaunchContext(
561
561
  detection=detection_result,
562
562
  config=dict(runtime_build_config),
563
563
  )
564
- # managed A2A:KSADK_A2A_RUNTIME_ID 非空时挂 discovery card + 完整数据面 route。
565
- # discovery card 让 server 探测;数据面 route 让 gateway 转发的 JSON-RPC/REST
566
- # 能真正落到本 runtime 的 A2A 协议端点(路线 C 直连)。
567
- _managed_a2a_card = None
568
- _a2a_config = None
564
+ # Runtime identity is available before registration for discovery. Operator
565
+ # enables the complete composition only after every Secret projection exists.
566
+ _managed_a2a_bootstrap = None
569
567
  _a2a_adapter = None
570
568
  if os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip():
571
- from ksadk.managed_a2a_card import build_managed_a2a_card_if_configured
572
-
573
- _managed_a2a_card = build_managed_a2a_card_if_configured()
574
- try:
575
- from ksadk.a2a.routes import A2AConfig
569
+ if os.environ.get("KSADK_A2A_MANAGED_BOOTSTRAP_ENABLED", "").strip().lower() == "true":
570
+ from ksadk.a2a.platform import build_managed_a2a_bootstrap_from_env
576
571
  from ksadk.runtime.factory import create_runtime_adapter
577
572
 
578
573
  _a2a_adapter = create_runtime_adapter(runtime_context)
579
- _base = (
580
- os.environ.get("KSADK_A2A_INTERNAL_BASE_URL", "").strip()
581
- or "http://localhost:8080"
582
- )
583
- _a2a_config = A2AConfig(
584
- enabled=True,
585
- base_url=_base,
586
- agent_name=(
587
- os.environ.get("KSADK_A2A_AGENT_NAME", "").strip()
588
- or os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip()
589
- ),
590
- streaming=True,
591
- task_store_dsn="sqlite+aiosqlite:///.agentengine/a2a_tasks.db",
592
- )
593
- except Exception as _e:
594
- logger.warning(f"managed A2A 数据面装配失败,回退 discovery-only: {{_e}}")
595
- _a2a_config = None
596
- _a2a_adapter = None
574
+ _managed_a2a_bootstrap = build_managed_a2a_bootstrap_from_env()
575
+ else:
576
+ from ksadk.managed_a2a_card import build_managed_a2a_card_if_configured
577
+
578
+ _managed_a2a_bootstrap = build_managed_a2a_card_if_configured()
597
579
  app = create_runtime_app(
598
580
  RuntimeAppConfig(
599
581
  runtime_type=detection_result.type.value,
600
582
  runtime_executor=RuntimeExecutor(build_default_runtime_registry()),
601
583
  launch_context=runtime_context,
602
- a2a=_a2a_config or _managed_a2a_card,
584
+ a2a=_managed_a2a_bootstrap,
603
585
  a2a_runtime_adapter=_a2a_adapter,
604
586
  ),
605
587
  configure_runtime_app,
@@ -19,6 +19,8 @@ LANGCHAIN_ECOSYSTEM_REQUIREMENTS = (
19
19
  "langchain-openai>=1.4.0,<2.0.0",
20
20
  "langchain-core>=1.5.0,<2.0.0",
21
21
  "langgraph>=1.2.0,<1.3.0",
22
+ # Plain Code runtimes use the local SQLite checkpoint backend by default.
23
+ "langgraph-checkpoint-sqlite>=2.0.0",
22
24
  )
23
25
 
24
26
  DEEPAGENTS_REQUIREMENTS = ("deepagents>=0.6.2,<1.0.0",)