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
@@ -28,6 +28,7 @@ _MANIFEST_KEYS = (
28
28
  "skills",
29
29
  "mcp_servers",
30
30
  "plugins",
31
+ "remote_agents",
31
32
  "sandbox",
32
33
  "approval_mode",
33
34
  "context",
@@ -163,6 +164,17 @@ class ManagedRuntimeBuilder(BaseBuilder):
163
164
  runtime_name = str(runtime.get("name") or "").strip().lower()
164
165
  if runtime_name != "codex":
165
166
  return "当前 ManagedRuntime v1 仅支持 runtime.name: codex"
167
+ if "remoteAgents" in config:
168
+ return "ManagedRuntime YAML 请使用 remote_agents 字段,不能静默忽略 remoteAgents"
169
+ if "remote_agents" in config:
170
+ from ksadk.plugins.host import PluginHostError
171
+ from ksadk.plugins.providers.codex import _bundle_a2a_experts
172
+ try:
173
+ _bundle_a2a_experts(config)
174
+ except (ValueError, PluginHostError):
175
+ # Validation errors can include authored input. Keep the CLI
176
+ # failure deterministic without echoing manifest data.
177
+ return "A2A_EXPERT_BINDING_INVALID: 请检查固定绑定、调用方式和执行策略"
166
178
  return None
167
179
 
168
180
  @staticmethod
@@ -0,0 +1,87 @@
1
+ """Collect immutable source and installed-package provenance."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import importlib.metadata as importlib_metadata
6
+ import json
7
+ import subprocess
8
+ from pathlib import Path
9
+ from typing import Any, Optional
10
+
11
+
12
+ def _git_provenance(start: Path) -> Optional[dict]:
13
+ """返回 start 所在 git 仓库的提交信息;非 git 目录返回 None。"""
14
+
15
+ def _git(*args: str) -> Optional[str]:
16
+ try:
17
+ proc = subprocess.run(
18
+ ["git", "-C", str(start), *args],
19
+ capture_output=True,
20
+ text=True,
21
+ timeout=10,
22
+ )
23
+ except Exception:
24
+ return None
25
+ if proc.returncode != 0:
26
+ return None
27
+ return proc.stdout.strip()
28
+
29
+ toplevel = _git("rev-parse", "--show-toplevel")
30
+ if not toplevel:
31
+ return None
32
+ commit = _git("rev-parse", "HEAD")
33
+ branch = _git("rev-parse", "--abbrev-ref", "HEAD")
34
+ status = _git("status", "--porcelain")
35
+ return {
36
+ "repo_root": toplevel,
37
+ "commit": commit,
38
+ "branch": branch or None,
39
+ "dirty": bool(status),
40
+ }
41
+
42
+
43
+ def _package_provenance(package_name: str, package_root: Path, *, git_reader: Any) -> dict:
44
+ """采集被 vendored 包的安装来源:dist 元信息 / 本地路径 / git 提交。"""
45
+
46
+ info: dict[str, Any] = {
47
+ "source_dir": str(package_root),
48
+ "dist_version": None,
49
+ "installer": None,
50
+ "direct_url": None,
51
+ "source_type": "unknown",
52
+ "git": None,
53
+ }
54
+ try:
55
+ dist = importlib_metadata.distribution(package_name)
56
+ except Exception:
57
+ dist = None
58
+ if dist is not None:
59
+ info["dist_version"] = dist.version
60
+ installer = (dist.read_text("INSTALLER") or "").strip()
61
+ info["installer"] = installer or None
62
+ raw_direct_url = dist.read_text("direct_url.json")
63
+ if raw_direct_url:
64
+ try:
65
+ direct_url = json.loads(raw_direct_url)
66
+ except ValueError:
67
+ direct_url = None
68
+ if isinstance(direct_url, dict):
69
+ info["direct_url"] = direct_url.get("url")
70
+ url = str(direct_url.get("url") or "")
71
+ dir_info = direct_url.get("dir_info") or {}
72
+ archive_info = direct_url.get("archive_info") or {}
73
+ if url.startswith("file://"):
74
+ if dir_info.get("editable"):
75
+ info["source_type"] = "editable-install"
76
+ elif url.endswith(".whl"):
77
+ info["source_type"] = "local-wheel"
78
+ else:
79
+ info["source_type"] = "local-path"
80
+ elif archive_info:
81
+ info["source_type"] = "remote-dist"
82
+ if info["direct_url"] is None and info["dist_version"] is not None:
83
+ # pip 从 index 安装的常规 dist 通常不写 direct_url.json
84
+ info["source_type"] = "installed-dist"
85
+ if info["source_type"] in {"editable-install", "local-path", "unknown"}:
86
+ info["git"] = git_reader(package_root)
87
+ return info
ksadk/cli/cmd_a2a.py CHANGED
@@ -199,6 +199,49 @@ def register(agent_path: Path, url: str, name: str | None, description: str, ski
199
199
  click.echo(MessageToJson(card_obj, indent=2))
200
200
 
201
201
 
202
+ @a2a.command("register-hosted", context_settings=_HELP)
203
+ @click.option("--agent-id", required=True, help="已通过 deploy 创建的托管运行时 ID")
204
+ @click.option("--space-id", "space_ids", multiple=True, required=True, help="加入的 A2A Space;可重复")
205
+ @click.option("--region", required=True, help="显式选择环境/区域,例如 pre-online")
206
+ def register_hosted(agent_id: str, space_ids: Sequence[str], region: str):
207
+ """将已部署的 hosted Agent 注册为可被 Space 内其他 Agent 调用的服务。"""
208
+ from ksadk.api.client import AgentEngineClient
209
+
210
+ agent_id, region = agent_id.strip(), region.strip()
211
+ spaces = list(dict.fromkeys(space.strip() for space in space_ids))
212
+ if not agent_id or not region or any(not space for space in spaces):
213
+ raise click.UsageError("agent-id、space-id 和 region 不得为空")
214
+
215
+ async def run():
216
+ client = AgentEngineClient(region=region)
217
+ try:
218
+ preview = await client._action_async(
219
+ "GetAToARuntimeConfig", {"AgentId": agent_id}, preserve_case=True,
220
+ )
221
+ card = preview.get("AgentCard")
222
+ if not isinstance(card, dict) or not card:
223
+ raise ValueError("Runtime AgentCard unavailable")
224
+ result = await client._action_async("CreateAToAAgent", {
225
+ "Source": "hosted", "AgentId": agent_id, "A2ASpaceIds": spaces,
226
+ "AgentCard": card,
227
+ })
228
+ except Exception as exc:
229
+ # An ambiguous response is not automatically retried: registration
230
+ # may already exist. Never print private upstream bodies or routes.
231
+ code = getattr(exc, "code", None)
232
+ raise click.ClickException(
233
+ f"Hosted A2A 注册失败(code={code or 'unavailable'});请查询注册状态后再重试"
234
+ ) from None
235
+ finally:
236
+ await client.close()
237
+ click.echo(json.dumps({
238
+ "a2a_agent_id": result.get("a2_a_agent_id", result.get("A2AAgentId")),
239
+ "status": result.get("status", result.get("Status")),
240
+ }, ensure_ascii=False))
241
+
242
+ asyncio.run(run())
243
+
244
+
202
245
  # ---------------------------------------------------------------------------
203
246
  # discover / call / status / cancel(Space 内动态发现与调用,经 A2ASpaceClient)
204
247
  # ---------------------------------------------------------------------------
ksadk/cli/cmd_build.py CHANGED
@@ -285,6 +285,15 @@ async def _build_code(
285
285
  if not result.success:
286
286
  raise validation_error(result.error_message or "构建失败")
287
287
 
288
+ if result.artifact_path is not None:
289
+ from ksadk.builders.code_builder import _sha256_file, read_code_deployment_contract
290
+
291
+ result.metadata["code_checksum"] = _sha256_file(result.artifact_path)
292
+ contract = read_code_deployment_contract(result.artifact_path)
293
+ if contract and contract.get("schema") == "ksadk-code-deployment/v1":
294
+ result.metadata["code_command"] = contract.get("command")
295
+ result.metadata["code_kernel_contract_digest"] = contract.get("agentKernelContractDigest")
296
+
288
297
  agent_name = result.metadata.get("agent_name", agent_path.name)
289
298
 
290
299
  # 上传到 KS3
ksadk/cli/cmd_deploy.py CHANGED
@@ -104,6 +104,8 @@ console = get_console()
104
104
  default=None,
105
105
  help="Serverless 部署模式;默认从 agentengine.yaml 推断",
106
106
  )
107
+ @click.option("--a2a-space-id", help="绑定 A2A Space(Serverless);省略时保留已有绑定")
108
+ @click.option("--a2a-runtime-profile", type=click.Choice(["managed-a2a", "managed-a2a-basic", "managed-a2a-memory"]), help="A2A 能力配置;需同时指定 --a2a-space-id")
107
109
  @click.option("--namespace", default="default", help="K8s 命名空间")
108
110
  @click.option("--port", "-p", default=8000, help="服务端口 (default: 8000)")
109
111
  @click.option("--registry", help="镜像仓库地址 (k8s/serverless Container 模式)")
@@ -148,6 +150,8 @@ def deploy(
148
150
  region: str,
149
151
  account_id: str,
150
152
  artifact_type: str,
153
+ a2a_space_id: str | None,
154
+ a2a_runtime_profile: str | None,
151
155
  namespace: str,
152
156
  port: int,
153
157
  registry: str,
@@ -250,6 +254,8 @@ def deploy(
250
254
  repackage=repackage,
251
255
  dry_run_context=dry_run_context,
252
256
  agent_id=agent_id,
257
+ a2a_space_id=a2a_space_id,
258
+ a2a_runtime_profile=a2a_runtime_profile,
253
259
  ),
254
260
  dry_run=dry_run,
255
261
  on_dry_run=render_deploy_dry_run,
@@ -326,11 +332,20 @@ async def _deploy_async(
326
332
  *,
327
333
  repackage: bool = False,
328
334
  agent_id: str | None = None,
335
+ a2a_space_id: str | None = None,
336
+ a2a_runtime_profile: str | None = None,
329
337
  ):
330
338
  """异步部署流程"""
331
339
  from ksadk.deployment import DeploymentManager, DeployStatus, DeployTarget
332
340
  from ksadk.detection import FrameworkDetector
333
341
 
342
+ if a2a_runtime_profile and not a2a_space_id:
343
+ raise validation_error("--a2a-runtime-profile requires --a2a-space-id")
344
+ if a2a_space_id is not None:
345
+ a2a_space_id = a2a_space_id.strip()
346
+ if target != "serverless" or not a2a_space_id:
347
+ raise validation_error("--a2a-space-id 需要非空 Space ID,且仅支持 Serverless 部署")
348
+
334
349
  agent_path = Path(agent_dir).resolve()
335
350
  config = _load_config(agent_path)
336
351
  try:
@@ -385,6 +400,11 @@ async def _deploy_async(
385
400
 
386
401
  resolved_runtime = None
387
402
  if effective_artifact_type == "ManagedRuntime":
403
+ if image:
404
+ raise validation_error(
405
+ "ManagedRuntime 不支持 --image;镜像由服务端 Runtime catalog 选择。"
406
+ "请通过 runtime.version 指定已登记的运行时版本。"
407
+ )
388
408
  if detection_result.type.value != "codex":
389
409
  raise validation_error("ManagedRuntime v1 目前仅支持 framework: codex")
390
410
  if ks3_path:
@@ -443,6 +463,8 @@ async def _deploy_async(
443
463
  "runtime_name": resolved_runtime.name if resolved_runtime else "",
444
464
  "runtime_version": resolved_runtime.version if resolved_runtime else "",
445
465
  "agent_id": agent_id,
466
+ "a2a_space_id": a2a_space_id,
467
+ "a2a_runtime_profile": a2a_runtime_profile,
446
468
  },
447
469
  )
448
470
 
@@ -611,7 +633,9 @@ async def _deploy_async(
611
633
  # CreateAgent callback may still be pending, so presenting it as a
612
634
  # completed deployment is misleading (and hides a broken
613
635
  # callback/data-plane handoff).
614
- if result.status == DeployStatus.RUNNING:
636
+ if result.metadata.get("update_accepted"):
637
+ print_info("Agent 更新请求已提交,服务端将在后台执行,请稍后查看 Agent 状态")
638
+ elif result.status == DeployStatus.RUNNING:
615
639
  print_success("部署成功")
616
640
  else:
617
641
  print_info("部署请求已提交,等待实例就绪")
@@ -631,7 +655,8 @@ async def _deploy_async(
631
655
  print_kv("信息", result.message)
632
656
 
633
657
  # 9. 自动创建版本快照 (仅热更新时,首次部署平台自动创建 v1)
634
- is_update = result.message and "已更新" in result.message
658
+ is_update = (not result.metadata.get("update_accepted")
659
+ and result.message and "已更新" in result.message)
635
660
  if result.agent_id and is_update and not no_version and not dry_run:
636
661
  from ksadk.cli.deploy_utils import auto_release_version
637
662
 
ksadk/cli/cmd_invoke.py CHANGED
@@ -36,6 +36,8 @@ from ksadk.hermes_terminal import run_hermes_terminal_session
36
36
  from ksadk.terminal_client import run_terminal_session
37
37
  from ksadk_runtime_common.workspace_files.constants import DEFAULT_WORKSPACE_MAX_UPLOAD_BYTES
38
38
 
39
+ from ksadk.cli.invoke_content import _extract_content, _extract_response_content
40
+
39
41
  console: Any = None
40
42
  Markdown: Any = None
41
43
  Live: Any = None
@@ -583,6 +585,14 @@ def run_invoke_command(
583
585
 
584
586
  if message:
585
587
  # 单次调用模式
588
+ if not local and not _is_openclaw_target(next_state, latest_access) and not _is_hermes_target(next_state, latest_access):
589
+ from ksadk.cli.hosted_invoke import try_invoke_hosted_once
590
+
591
+ if try_invoke_hosted_once(
592
+ endpoint=endpoint, api_key=api_key, session_id=session_id,
593
+ message=message, model=model, insecure=insecure,
594
+ ):
595
+ return
586
596
  api_format_resolved = asyncio.run(
587
597
  _resolve_remote_api_format(
588
598
  endpoint=endpoint,
@@ -1375,7 +1385,7 @@ async def _invoke_once(
1375
1385
  else:
1376
1386
  click.echo(content)
1377
1387
  except Exception as e:
1378
- click.secho(f"\n❌ 调用失败: {e}", fg="red")
1388
+ raise click.ClickException(f"调用失败: {e}") from e
1379
1389
 
1380
1390
 
1381
1391
  async def _chat(
@@ -1485,94 +1495,37 @@ async def _stream_chat(
1485
1495
  async with httpx.AsyncClient(**client_kwargs) as client:
1486
1496
  async with client.stream("POST", url, json=payload, headers=headers) as response:
1487
1497
  response.raise_for_status()
1488
- try:
1489
- current_event = ""
1490
- # Use aiter_lines() for robust UTF-8 decoding and line splitting
1491
- async for line in response.aiter_lines():
1492
- if not line:
1493
- continue
1494
-
1495
- if line.startswith("event: "):
1496
- current_event = line[7:].strip()
1497
- continue
1498
-
1499
- if line.startswith("data: "):
1500
- data_str = line[6:].strip()
1501
- if data_str == "[DONE]":
1502
- break
1503
-
1504
- try:
1505
- data = json.loads(data_str)
1506
- if not isinstance(data, dict):
1507
- continue
1508
- if current_event and isinstance(data, dict):
1509
- data = {**data, "_event": current_event}
1510
- # 直接 yield 解析后的 JSON 数据,让 _extract_content 处理
1511
- yield data
1512
-
1513
- # Handle events/errors
1514
- error = data.get("error")
1515
- if error:
1516
- click.secho(f"\nError: {error}", fg="red")
1517
-
1518
- except json.JSONDecodeError:
1519
- pass
1520
- except Exception as e:
1521
- click.secho(f"\nStream error: {e}", fg="red")
1522
-
1523
-
1524
- def _extract_content(chunk: dict) -> tuple[str, str]:
1525
- """从 OpenAI 流式响应中提取内容 (包含 reasoning_content)"""
1526
- event_name = str(chunk.get("_event") or "")
1527
- if event_name == "response.output_text.delta":
1528
- return str(chunk.get("delta") or ""), ""
1529
- # reasoning delta 有 4 个变体名(与 remote_runner / 前端 chatProtocol 对齐),
1530
- # 主 runtime 发 reasoning.delta,Studio shared_web 发 reasoning_summary_text.delta。
1531
- if event_name in {
1532
- "response.reasoning.delta",
1533
- "response.reasoning_text.delta",
1534
- "response.reasoning_summary.delta",
1535
- "response.reasoning_summary_text.delta",
1536
- }:
1537
- return "", str(chunk.get("delta") or chunk.get("text") or "")
1538
- if event_name == "response.completed":
1539
- return "", ""
1540
-
1541
- # OpenAI 格式: {"choices": [{"delta": {"content": "xxx", "reasoning_content": "thought"}}]}
1542
- try:
1543
- choices = chunk.get("choices", [])
1544
- if choices:
1545
- delta = choices[0].get("delta", {})
1546
- return delta.get("content", "") or "", delta.get("reasoning_content", "") or ""
1547
- except (KeyError, IndexError):
1548
- pass
1549
-
1550
- if isinstance(chunk.get("output_text"), str):
1551
- return chunk["output_text"], ""
1552
- if isinstance(chunk.get("delta"), str):
1553
- return chunk["delta"], ""
1554
- return "", ""
1555
-
1556
-
1557
- def _extract_response_content(response: dict) -> str:
1558
- """从 OpenAI 非流式响应中提取内容"""
1559
- output_text = response.get("output_text")
1560
- if output_text:
1561
- return str(output_text)
1562
- output = response.get("output") or []
1563
- for item in output:
1564
- if not isinstance(item, dict):
1565
- continue
1566
- for content in item.get("content") or []:
1567
- if isinstance(content, dict) and content.get("text"):
1568
- return str(content["text"])
1569
-
1570
- # OpenAI 格式: {"choices": [{"message": {"content": "xxx"}}]}
1571
- try:
1572
- choices = response.get("choices", [])
1573
- if choices:
1574
- message = choices[0].get("message", {})
1575
- return str(message.get("content") or "")
1576
- except (KeyError, IndexError):
1577
- pass
1578
- return str(response)
1498
+ current_event = ""
1499
+ # Use aiter_lines() for robust UTF-8 decoding and line splitting
1500
+ async for line in response.aiter_lines():
1501
+ if not line:
1502
+ continue
1503
+
1504
+ if line.startswith("event: "):
1505
+ current_event = line[7:].strip()
1506
+ continue
1507
+
1508
+ if line.startswith("data: "):
1509
+ data_str = line[6:].strip()
1510
+ if data_str == "[DONE]":
1511
+ break
1512
+
1513
+ try:
1514
+ data = json.loads(data_str)
1515
+ if not isinstance(data, dict):
1516
+ continue
1517
+ if current_event and isinstance(data, dict):
1518
+ data = {**data, "_event": current_event}
1519
+ event_type = current_event or data.get("type")
1520
+ response_payload = data.get("response")
1521
+ nested_error = (
1522
+ response_payload.get("error")
1523
+ if isinstance(response_payload, dict) else None
1524
+ )
1525
+ error = data.get("error") or nested_error
1526
+ if error or event_type in {"error", "response.failed"}:
1527
+ raise RuntimeError(str(error or data.get("message") or event_type))
1528
+ yield data
1529
+
1530
+ except json.JSONDecodeError:
1531
+ pass
ksadk/cli/cmd_studio.py CHANGED
@@ -211,7 +211,11 @@ def studio(
211
211
  security_enabled=os.environ.get("KSADK_STUDIO_NO_SECURITY") != "1",
212
212
  )
213
213
  base_url = f"http://127.0.0.1:{port}/"
214
- launch_url = f"{base_url}#session={session_token}"
214
+ # The Core UI is the normal Studio host when profile plugins are
215
+ # enabled. Do not rely on a fragment surviving the root 307 redirect:
216
+ # browser implementations may drop it, leaving the page unauthenticated
217
+ # after every local server restart.
218
+ launch_url = f"{base_url}studio-core/#session={session_token}"
215
219
 
216
220
  print_title("启动 AgentKit Local Studio")
217
221
  print_kv("工作区", str(root))
ksadk/cli/cmd_web.py CHANGED
@@ -40,6 +40,8 @@ _SESSION_ENV_NAMES = (
40
40
  _CHECKPOINT_ENV_NAMES = (
41
41
  "KSADK_CHECKPOINT_BACKEND",
42
42
  "KSADK_CHECKPOINT_PATH",
43
+ "KSADK_CHECKPOINT_DSN",
44
+ "KSADK_LANGGRAPH_CHECKPOINT_DSN",
43
45
  )
44
46
  _LOCAL_UI_ENV_NAMES = ("AGENTENGINE_UI_DIR",)
45
47
 
@@ -0,0 +1,206 @@
1
+ """Invoke platform hosted Agents through their admitted Action surface."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import time
7
+
8
+ import click
9
+ import requests
10
+
11
+ from ksadk.conversations.message_projection import project_session_messages
12
+
13
+
14
+ def try_invoke_hosted_once(*, endpoint, api_key, session_id, message, model, insecure):
15
+ """Return False for ordinary OpenAI servers; never bypass hosted admission."""
16
+ with requests.Session() as transport:
17
+ transport.verify = not insecure
18
+ if api_key:
19
+ transport.headers["Authorization"] = "Bearer " + api_key
20
+
21
+ def action(name, body, *, missing_ok=False, request_timeout=45):
22
+ response = transport.post(
23
+ endpoint.rstrip("/") + "/agentengine/api/v1/" + name,
24
+ json=body, timeout=request_timeout, allow_redirects=False,
25
+ )
26
+ if response.is_redirect:
27
+ raise click.ClickException("Hosted Action redirected; request was not replayed")
28
+ if missing_ok and response.status_code == 404:
29
+ return None
30
+ response.raise_for_status()
31
+ envelope = response.json()
32
+ if missing_ok and envelope.get("Code") == 404:
33
+ return None
34
+ if envelope.get("Code") not in (None, 0):
35
+ raise click.ClickException(str(envelope.get("Message") or "Hosted Action failed"))
36
+ data = envelope.get("Data", envelope)
37
+ if not isinstance(data, dict):
38
+ raise click.ClickException("Hosted Action returned no result")
39
+ return data
40
+
41
+ try:
42
+ bootstrap = action("GetAgentUiBootstrap", {}, missing_ok=True)
43
+ except requests.HTTPError as exc:
44
+ if exc.response.status_code in (404, 405):
45
+ return False
46
+ raise click.ClickException("Hosted bootstrap authentication or transport failed") from exc
47
+ if bootstrap is None:
48
+ return False
49
+ agent_id = (bootstrap.get("Agent") or {}).get("AgentId")
50
+ if (not agent_id or not isinstance(bootstrap.get("HostedRuntime"), dict)
51
+ or (bootstrap.get("Capabilities") or {}).get("KernelSessionEvents") is not True):
52
+ return False
53
+
54
+ session_body = {"AgentId": agent_id, "SessionId": session_id}
55
+ session = action("GetSession", session_body, missing_ok=True)
56
+ if session is None:
57
+ session = action("CreateSession", session_body)
58
+ session = session.get("Session", session)
59
+ session_id = session.get("SessionId") or session.get("Id")
60
+ if not session_id:
61
+ raise click.ClickException("CreateSession returned no session identity")
62
+ body = {
63
+ "AgentId": agent_id, "SessionId": session_id,
64
+ "Messages": [{"role": "user", "content": message}],
65
+ "ApiFormat": "chat_completions", "Stream": False, "Background": True,
66
+ }
67
+ if model:
68
+ body["Model"] = model
69
+ receipt = action("RunAgent", body)
70
+ run_id = receipt.get("RunId") or receipt.get("InvocationId")
71
+ command_id, message_id = receipt.get("CommandId"), receipt.get("MessageId")
72
+ if not run_id and not (command_id and message_id):
73
+ raise click.ClickException("Hosted run returned no observable command identity")
74
+ click.echo(f"Session: {session_id}\nCommand: {command_id or run_id}")
75
+ cursor = 0
76
+ cursor_source = None
77
+ history_epoch = None
78
+ claimed_message = None
79
+ events = {}
80
+ submitted = set()
81
+ resolved = set()
82
+ pending = {}
83
+ terminal = None
84
+ deadline = time.monotonic() + 900
85
+ read_interrupted = False
86
+ while (remaining := deadline - time.monotonic()) > 0:
87
+ query = {
88
+ "AgentId": agent_id, "SessionId": session_id,
89
+ "AfterSeqId": cursor, "Limit": 200, "EventOrder": "session_seq",
90
+ }
91
+ if cursor_source:
92
+ query["CursorSource"] = cursor_source
93
+ if history_epoch:
94
+ query["HistoryEpoch"] = history_epoch
95
+ try:
96
+ page = action("ListSessionEvents", query, request_timeout=min(45, remaining))
97
+ except requests.exceptions.SSLError:
98
+ raise
99
+ except (requests.ConnectionError, requests.Timeout):
100
+ # This is an idempotent observation of an already admitted run.
101
+ # Preserve its cursor and original deadline; never replay a run
102
+ # or an interaction whose receipt may have been lost.
103
+ remaining = deadline - time.monotonic()
104
+ if remaining <= 0:
105
+ break
106
+ if not read_interrupted:
107
+ click.echo("Event read interrupted; retrying within the original wait deadline", err=True)
108
+ read_interrupted = True
109
+ time.sleep(min(1, remaining))
110
+ continue
111
+ source = page.get("CursorSource")
112
+ if (page.get("EventOrder") != "session_seq" or source not in ("runtime", "control")
113
+ or type(page.get("HasMore")) is not bool):
114
+ raise click.ClickException(
115
+ "Hosted Runtime does not support forward session event reads; upgrade Runtime. "
116
+ f"Run continues. Session: {session_id}, Command: {command_id}, Run: {run_id}"
117
+ )
118
+ if cursor_source and source != cursor_source:
119
+ raise click.ClickException("Hosted event cursor source changed; inspect the session above")
120
+ page_epoch = page.get("HistoryEpoch")
121
+ if page_epoch is not None and (not isinstance(page_epoch, str) or not page_epoch):
122
+ raise click.ClickException("Hosted Runtime returned an invalid history epoch")
123
+ if cursor_source and page_epoch != history_epoch:
124
+ raise click.ClickException("Hosted history epoch changed; inspect the session above")
125
+ history_epoch = page_epoch
126
+ cursor_source = source
127
+ rows = page.get("Events")
128
+ next_cursor = page.get("NextCursor")
129
+ if (not isinstance(rows, list) or type(next_cursor) is not int
130
+ or any(not isinstance(e, dict) or type(e.get("SeqId")) is not int for e in rows)):
131
+ raise click.ClickException("Hosted Runtime returned an invalid forward event page")
132
+ rows = sorted(rows, key=lambda e: e["SeqId"])
133
+ seqs = [e["SeqId"] for e in rows]
134
+ if (any(seq <= cursor for seq in seqs) or len(set(seqs)) != len(seqs)
135
+ or next_cursor != (seqs[-1] if seqs else cursor)
136
+ or (page["HasMore"] and not rows)):
137
+ raise click.ClickException("Hosted Runtime returned a non-progressing forward event page")
138
+ cursor = next_cursor
139
+ for event in rows:
140
+ content = event.get("Content") or {}
141
+ fact = content.get("runtime_event") or (content.get("session_event") or {}).get("payload") or {}
142
+ kind = event.get("EventType")
143
+ if not run_id:
144
+ if kind == "control.command_rejected" and fact.get("command_id") == command_id:
145
+ raise click.ClickException("Admitted command was rejected by the worker")
146
+ if kind == "control.message_claimed":
147
+ claimed_message = fact.get("message_id")
148
+ # Session worker serializes claim -> pending transition.
149
+ # An accepted enqueue has no RunId until its own message is claimed.
150
+ if (kind == "control.run_transition" and fact.get("state") == "pending"
151
+ and claimed_message == message_id and fact.get("run_id")):
152
+ run_id = fact["run_id"]
153
+ click.echo(f"Run: {run_id}")
154
+ else:
155
+ continue
156
+ if fact.get("run_id", event.get("InvocationId")) != run_id:
157
+ continue
158
+ if not fact.get("parent_scope_id"):
159
+ events[event.get("EventId") or str(event["SeqId"])] = event
160
+ if kind == "interaction.requested":
161
+ pending[(fact.get("interaction_id"), fact.get("revision"))] = fact
162
+ if kind in ("interaction.resolved", "interaction.expired"):
163
+ resolved.add(fact.get("interaction_id"))
164
+ if kind in ("run.completed", "run.failed", "run.canceled") and not fact.get("parent_scope_id"):
165
+ terminal = kind
166
+ # Decisions require the whole available forward window: resolution
167
+ # or the root terminal may be on a later page than the request.
168
+ if page["HasMore"]:
169
+ continue
170
+ for key, fact in pending.items():
171
+ interaction_id = fact.get("interaction_id")
172
+ revision = fact.get("revision")
173
+ if terminal or key in submitted or interaction_id in resolved:
174
+ continue
175
+ request = fact.get("request") or {}
176
+ presentation = request.get("presentation") or {}
177
+ click.echo(presentation.get("title") or "Interaction required")
178
+ click.echo(presentation.get("description") or "")
179
+ if request.get("kind") != "approval" or not interaction_id or not revision:
180
+ raise click.ClickException("Run requires input; continue in Dashboard using the session above")
181
+ try:
182
+ approved = click.confirm("批准并继续?", default=False)
183
+ except click.Abort:
184
+ raise click.ClickException("Run is waiting for approval; continue in Dashboard using the session above") from None
185
+ if time.monotonic() >= deadline:
186
+ break
187
+ decision = "approve" if approved else "reject"
188
+ token = hashlib.sha256(f"{run_id}:{interaction_id}:{revision}:{decision}".encode()).hexdigest()
189
+ action("SubmitInteraction", {
190
+ "AgentId": agent_id, "SessionId": session_id, "RunId": run_id,
191
+ "InteractionId": interaction_id, "ExpectedRevision": revision,
192
+ "InteractionAction": decision, "Response": {"decision": decision},
193
+ "IdempotencyKey": "cli-" + token,
194
+ })
195
+ submitted.add(key)
196
+ if terminal:
197
+ if terminal != "run.completed":
198
+ raise click.ClickException(f"Hosted run ended with {terminal}; Session: {session_id}, Run: {run_id}")
199
+ projected = project_session_messages(list(events.values()))
200
+ answers = [m for m in projected if m.get("Role") == "assistant" and (m.get("Content") or {}).get("text")]
201
+ if not answers:
202
+ raise click.ClickException("Completed run has no text result; inspect the session above")
203
+ click.echo((answers[-1]["Content"] or {})["text"])
204
+ return True
205
+ time.sleep(1)
206
+ raise click.ClickException(f"Waiting timed out; run continues. Session: {session_id}, Command: {command_id}, Run: {run_id}")