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/plugins/builtins.py CHANGED
@@ -9,24 +9,74 @@ contract; it does not introduce another event or transcript pipeline.
9
9
 
10
10
  from __future__ import annotations
11
11
 
12
+ import asyncio
12
13
  import hashlib
13
14
  import json
15
+ import threading
14
16
  from collections.abc import Callable, Mapping, Sequence
15
- from pathlib import Path, PurePosixPath
17
+ from pathlib import Path
18
+ from pathlib import PurePosixPath as PurePosixPath
16
19
  from typing import Any, cast
17
20
 
18
21
  from ksadk.conversations.contracts import ConversationItem
19
22
  from ksadk.events.session_event import SessionServiceEventStore
20
23
  from ksadk.harness.config import McpToolSpec
24
+ from ksadk.plugins.builtin_resources import (
25
+ _bound_capability_config as _bound_capability_config,
26
+ )
27
+ from ksadk.plugins.builtin_resources import (
28
+ _directory_digest as _directory_digest,
29
+ )
30
+ from ksadk.plugins.builtin_resources import (
31
+ _directory_resource_digests as _directory_resource_digests,
32
+ )
33
+ from ksadk.plugins.builtin_resources import (
34
+ _is_secret_reference as _is_secret_reference,
35
+ )
36
+ from ksadk.plugins.builtin_resources import (
37
+ _mapping as _mapping,
38
+ )
39
+ from ksadk.plugins.builtin_resources import (
40
+ _match_resource as _match_resource,
41
+ )
42
+ from ksadk.plugins.builtin_resources import (
43
+ _optional_string as _optional_string,
44
+ )
45
+ from ksadk.plugins.builtin_resources import (
46
+ _required_string as _required_string,
47
+ )
48
+ from ksadk.plugins.builtin_resources import (
49
+ _resolved_resources as _resolved_resources,
50
+ )
51
+ from ksadk.plugins.builtin_resources import (
52
+ _resource_entries as _resource_entries,
53
+ )
54
+ from ksadk.plugins.builtin_resources import (
55
+ _safe_bundle_path as _safe_bundle_path,
56
+ )
57
+ from ksadk.plugins.builtin_resources import (
58
+ _string_list as _string_list,
59
+ )
21
60
  from ksadk.plugins.bundle import ResolvedPluginBundle
22
61
  from ksadk.plugins.contracts import (
23
62
  CompositionProfile,
24
63
  PluginManifest,
25
- plugin_lock_digest,
64
+ )
65
+ from ksadk.plugins.contracts import (
66
+ plugin_lock_digest as plugin_lock_digest,
26
67
  )
27
68
  from ksadk.plugins.host import PluginHostError
69
+ from ksadk.plugins.memory_provider import (
70
+ MemoryFlushRequest,
71
+ MemoryMutationRequest,
72
+ MemoryRecallRequest,
73
+ MemoryReceiptRequest,
74
+ MemoryRecordRequest,
75
+ memory_db_path,
76
+ memory_scope_bindings,
77
+ )
28
78
  from ksadk.plugins.providers.harness import HarnessSkillContribution, HarnessTurnRequest
29
- from ksadk.plugins.resolver import composition_profile_digest
79
+ from ksadk.plugins.resolver import composition_profile_digest as composition_profile_digest
30
80
  from ksadk.sessions.base import BaseSessionService
31
81
  from ksadk.sessions.local_service import LocalSessionService
32
82
 
@@ -72,7 +122,7 @@ def _manifest(
72
122
  "compatibility": {
73
123
  "kernelApi": ">=1,<2",
74
124
  "runtimeProtocols": ["agentkit.runtime/v1"],
75
- "python": ">=3.10,<3.15",
125
+ "python": ">=3.12,<3.15",
76
126
  },
77
127
  "healthContract": "plugin.health/v1",
78
128
  "provenance": {
@@ -124,6 +174,7 @@ def builtin_capability_manifests() -> tuple[PluginManifest, ...]:
124
174
  definition="memory.provider/v1",
125
175
  slot="memory.primary",
126
176
  mode="unique",
177
+ permissions=("filesystem:memory-store",),
127
178
  ),
128
179
  _manifest(
129
180
  CORE_RENDERER_PLUGIN_ID,
@@ -241,6 +292,277 @@ class SQLiteSessionStoreRuntime(_BuiltinRuntime):
241
292
  await service.aclose()
242
293
 
243
294
 
295
+ class LocalMemoryProviderRuntime(_BuiltinRuntime):
296
+ """Own lazy tenant databases; the immutable Build grants each recall scope."""
297
+
298
+ def __init__(self, plugin_id: str, version: str, *, state_root: Path):
299
+ super().__init__(plugin_id, version)
300
+ self._state_root = state_root.resolve()
301
+ self._providers: dict[str, Any] = {}
302
+ self._provider_lock = threading.Lock()
303
+ self._pending: set[asyncio.Task] = set()
304
+
305
+ async def memory_recall(self, bundle: ResolvedPluginBundle, request: MemoryRecallRequest):
306
+ from ksadk.memory.models import MemorySearchResult
307
+ from ksadk.studio.contracts import MemorySpec
308
+
309
+ self._config(bundle)
310
+ request = MemoryRecallRequest.model_validate_json(request.model_dump_json())
311
+ policy = MemorySpec.model_validate(bundle.resolved_agent_spec.get("memory") or {})
312
+ if (not policy.enabled or not policy.recall.enabled or not request.max_tokens
313
+ or not request.query.strip() or not request.scopes):
314
+ return MemorySearchResult("not_configured", [], None, "local-default", 0, "exact")
315
+ if (request.principal.agent_id != bundle.manifest.agent_id
316
+ or policy.provider_ref != "local-default"
317
+ or set(request.scopes) - set(policy.scopes)
318
+ or request.top_k > policy.recall.top_k
319
+ or request.max_tokens > policy.recall.max_tokens
320
+ or request.min_score != policy.recall.min_score):
321
+ raise PluginHostError("memory_recall_unbound", "Memory recall exceeds its Build grant")
322
+ return await self._owned(self._recall, request)
323
+
324
+ async def memory_search(self, bundle: ResolvedPluginBundle, request: MemoryRecallRequest):
325
+ """A model-directed read retains Build bounds without automatic injection."""
326
+ request = MemoryRecallRequest.model_validate_json(request.model_dump_json())
327
+ policy = self._memory_policy(bundle, request.principal)
328
+ if (set(request.scopes) - set(policy.scopes)
329
+ or request.top_k > policy.recall.top_k
330
+ or request.max_tokens > policy.recall.max_tokens
331
+ or request.min_score != policy.recall.min_score):
332
+ raise PluginHostError("memory_search_unbound", "Memory search exceeds its Build grant")
333
+ if not request.query.strip():
334
+ raise PluginHostError("memory_search_query_missing", "Memory search requires a query")
335
+ if not request.max_tokens or not request.scopes:
336
+ from ksadk.memory.models import MemorySearchResult
337
+
338
+ return MemorySearchResult("not_configured", [], None, "local-default", 0, "exact")
339
+ return await self._owned(self._recall, request)
340
+
341
+ async def _owned(self, callback, request):
342
+ task = asyncio.create_task(asyncio.to_thread(callback, request))
343
+ self._pending.add(task)
344
+ task.add_done_callback(self._drain_read)
345
+ # Cancellation cannot detach a database operation from its owner.
346
+ return await asyncio.shield(task)
347
+
348
+ def _drain_read(self, task):
349
+ self._pending.discard(task)
350
+ if not task.cancelled():
351
+ task.exception()
352
+
353
+ def _provider(self, principal):
354
+ from ksadk.memory.providers.local_sqlite import SqliteMemoryProvider
355
+
356
+ with self._provider_lock:
357
+ self._require_ready()
358
+ tenant = principal.tenant_id
359
+ if tenant not in self._providers:
360
+ self._providers[tenant] = SqliteMemoryProvider(
361
+ db_path=memory_db_path(self._state_root, principal),
362
+ tenant_id=tenant, workspace_id=principal.workspace_id,
363
+ )
364
+ return self._providers[tenant]
365
+
366
+ def _recall(self, request):
367
+ from dataclasses import replace
368
+
369
+ from ksadk.memory.models import MemorySearchRequest
370
+
371
+ provider = self._provider(request.principal)
372
+ result = provider.search(MemorySearchRequest(
373
+ query=request.query,
374
+ scopes=list(memory_scope_bindings(request.principal, request.scopes)),
375
+ memory_types=["profile", "fact", "episode"], top_k=request.top_k,
376
+ max_tokens=request.max_tokens, min_score=request.min_score,
377
+ filters={"keyword_relevance": True, "defer_token_budget": True,
378
+ "tenant_id": request.principal.tenant_id},
379
+ ))
380
+ return replace(result, provider="local-default",
381
+ retrieval_strategy="keyword")
382
+
383
+ def _memory_policy(self, bundle, principal):
384
+ from ksadk.studio.contracts import MemorySpec
385
+
386
+ self._config(bundle)
387
+ policy = MemorySpec.model_validate(bundle.resolved_agent_spec.get("memory") or {})
388
+ if (not policy.enabled or policy.provider_ref != "local-default"
389
+ or principal.agent_id != bundle.manifest.agent_id):
390
+ raise PluginHostError("memory_unbound", "Memory is outside its Build grant")
391
+ return policy
392
+
393
+ async def memory_read(self, bundle, request: MemoryRecordRequest):
394
+ request = MemoryRecordRequest.model_validate_json(request.model_dump_json())
395
+ policy = self._memory_policy(bundle, request.principal)
396
+ if set(request.scopes) - set(policy.scopes):
397
+ raise PluginHostError("memory_unbound", "Memory is outside its Build scopes")
398
+ return await self._owned(self._read_record, request)
399
+
400
+ def _read_record(self, request):
401
+ record = self._provider(request.principal).get(request.memory_id)
402
+ allowed = memory_scope_bindings(request.principal, request.scopes)
403
+ if (record is None or record.tenant_id != request.principal.tenant_id
404
+ or (record.scope != "org" and record.workspace_id != request.principal.workspace_id)
405
+ or (record.scope, record.scope_id) not in allowed
406
+ or record.status != "active" or record.sensitivity == "high"):
407
+ return None
408
+ return record
409
+
410
+ async def memory_mutate(self, bundle, request: MemoryMutationRequest):
411
+ from ksadk.memory.models import MemoryCandidate
412
+ from ksadk.memory.policy import MemoryPolicy
413
+ from ksadk.studio.contracts import ContextSpec
414
+
415
+ request = MemoryMutationRequest.model_validate_json(request.model_dump_json())
416
+ policy = self._memory_policy(bundle, request.principal)
417
+ rollout = ContextSpec.model_validate(
418
+ bundle.resolved_agent_spec.get("context") or {}
419
+ ).rollout.memory_write
420
+ if (policy.write.mode == "off" or rollout == "off" or request.scope not in policy.scopes
421
+ or (policy.write.mode == "explicit_only" and request.authority == "candidate")
422
+ or (request.action == "forget" and request.authority == "candidate")):
423
+ raise PluginHostError("memory_write_disabled", "Memory write is not granted")
424
+ scope, scope_id = memory_scope_bindings(request.principal, (request.scope,))[0]
425
+ reason = "explicit_user_request" if request.authority != "candidate" else "model_guess"
426
+ candidate = MemoryCandidate(
427
+ candidate_id=request.operation_key, operation={"remember": "add", "correct": "update",
428
+ "forget": "delete"}[request.action],
429
+ memory_type="profile", scope=scope, scope_id=scope_id, content=request.content,
430
+ confidence=1 if request.authority != "candidate" else 0, importance=0.8,
431
+ source_event_ids=[request.source_event_id], reason=reason,
432
+ conflicts_with=[request.memory_id] if request.memory_id else [],
433
+ )
434
+ evaluation = MemoryPolicy().evaluate(candidate)
435
+ if evaluation.decision != "commit":
436
+ return {"committed": False, "decision": evaluation.decision,
437
+ "code": evaluation.reason}
438
+ if rollout == "shadow":
439
+ return {"committed": False, "decision": "shadow", "action": request.action}
440
+ return await self._owned(self._mutate, request)
441
+
442
+ def _mutate(self, request):
443
+ from ksadk.memory.extraction import native_user_memory_candidate
444
+ from ksadk.memory.models import MemoryRecord
445
+ from ksadk.memory.policy import content_hash
446
+
447
+ scope, scope_id = memory_scope_bindings(request.principal, (request.scope,))[0]
448
+ record = MemoryRecord(
449
+ memory_id=request.memory_id or "", tenant_id=request.principal.tenant_id,
450
+ workspace_id=request.principal.workspace_id, scope=scope, scope_id=scope_id,
451
+ memory_type="profile", content=request.content, summary=request.content,
452
+ status="active", confidence=1, importance=0.8,
453
+ valid_from="", valid_to="", expires_at="",
454
+ source_session_id=request.source_session_id, source_event_ids=[request.source_event_id],
455
+ source_seq_range=None, content_hash=content_hash(request.content), version=1,
456
+ metadata={"source_goal_revision": request.source_goal_revision,
457
+ "source_goal_digest": request.source_goal_digest,
458
+ "mutation_session_id": request.source_session_id},
459
+ write_policy="user_confirm",
460
+ )
461
+ consumed = []
462
+ if request.scope == "user":
463
+ for source in request.source_user_observations:
464
+ candidate = native_user_memory_candidate(
465
+ source.content, source_event_id=source.source_event_id,
466
+ scope=scope, scope_id=scope_id,
467
+ )
468
+ if candidate is not None:
469
+ consumed.append((candidate, source.source_digest))
470
+ return self._provider(request.principal).apply_mutation(
471
+ record, action=request.action, expected_version=request.expected_version,
472
+ operation_key=request.operation_key, request_digest=request.request_digest,
473
+ consumed_user_candidates=tuple(consumed),
474
+ )
475
+
476
+ async def memory_receipt(self, bundle, request: MemoryReceiptRequest):
477
+ request = MemoryReceiptRequest.model_validate_json(request.model_dump_json())
478
+ self._memory_policy(bundle, request.principal)
479
+ return await self._owned(self._receipt, request)
480
+
481
+ async def memory_flush(self, bundle, request: MemoryFlushRequest):
482
+ """Evaluate actual user observations under the locked Native write policy."""
483
+ from ksadk.memory.extraction import native_user_memory_candidate
484
+ from ksadk.memory.policy import MemoryPolicy
485
+ from ksadk.studio.contracts import ContextSpec
486
+
487
+ request = MemoryFlushRequest.model_validate_json(request.model_dump_json())
488
+ policy = self._memory_policy(bundle, request.principal)
489
+ rollout = ContextSpec.model_validate(
490
+ bundle.resolved_agent_spec.get("context") or {},
491
+ ).rollout.memory_write
492
+ if (policy.write.mode == "off" or rollout == "off" or "user" not in policy.scopes
493
+ or request.trigger == "pre_compaction"
494
+ and not policy.write.flush_before_compaction
495
+ or request.trigger == "completed_turn" and not policy.write.flush_after_turn):
496
+ return {"status": "disabled", "proposed": 0, "committed": 0, "results": []}
497
+ scope, scope_id = memory_scope_bindings(request.principal, ("user",))[0]
498
+ candidates = []
499
+ for observation in request.observations:
500
+ candidate = native_user_memory_candidate(
501
+ observation.content, source_event_id=observation.source_event_id,
502
+ scope=scope, scope_id=scope_id,
503
+ )
504
+ if candidate is not None and (
505
+ policy.write.mode != "explicit_only" or candidate.reason.startswith("explicit_user")
506
+ ):
507
+ candidates.append((observation, candidate))
508
+ if not candidates:
509
+ return {"status": "empty", "proposed": 0, "committed": 0, "results": []}
510
+ if rollout == "shadow":
511
+ # Shadow decisions live in the caller's effect receipt, not in a
512
+ # Provider database, pending-observation counter or durable fact.
513
+ return {"status": "shadow", "proposed": len(candidates), "committed": 0,
514
+ "results": [{"decision": MemoryPolicy().evaluate(item).decision}
515
+ for _source, item in candidates]}
516
+ return await self._owned(self._flush, (request, policy, candidates))
517
+
518
+ def _flush(self, data):
519
+ from ksadk.memory.extraction import NATIVE_USER_EXTRACTION_POLICY
520
+
521
+ request, policy, candidates = data
522
+ provider = self._provider(request.principal)
523
+ results = []
524
+ for observation, candidate in candidates:
525
+ identity = {"principal": request.principal.model_dump(mode="json"),
526
+ "source_event_id": observation.source_event_id,
527
+ "policy": NATIVE_USER_EXTRACTION_POLICY,
528
+ "memory": policy.model_dump(mode="json")}
529
+ # The original source identity is stable across compaction/Turn
530
+ # consumers under the same grant. Changed grants need a distinct
531
+ # evaluation receipt; the original source marker still prevents
532
+ # counting that evaluation as another user observation.
533
+ key = "native-memory-candidate:" + hashlib.sha256(
534
+ json.dumps(identity, sort_keys=True, ensure_ascii=False).encode(),
535
+ ).hexdigest()
536
+ payload = {**identity, "source": observation.model_dump(mode="json")}
537
+ request_digest = "sha256:" + hashlib.sha256(
538
+ json.dumps(payload, sort_keys=True, ensure_ascii=False).encode(),
539
+ ).hexdigest()
540
+ results.append(provider.apply_candidate(
541
+ candidate, operation_key=key, request_digest=request_digest,
542
+ source_session_id=observation.source_session_id,
543
+ source_digest=observation.source_digest,
544
+ tenant_id=request.principal.tenant_id,
545
+ workspace_id=request.principal.workspace_id,
546
+ ))
547
+ return {"status": "evaluated", "proposed": len(candidates),
548
+ "committed": sum(item["committed"] for item in results), "results": results}
549
+
550
+ def _receipt(self, request):
551
+ return self._provider(request.principal).mutation_receipt(
552
+ request.operation_key, request.request_digest
553
+ )
554
+
555
+ async def dispose(self):
556
+ self._ready = False
557
+ self._disposed = True
558
+ if self._pending:
559
+ await asyncio.gather(*tuple(self._pending), return_exceptions=True)
560
+ with self._provider_lock:
561
+ for provider in self._providers.values():
562
+ provider.close()
563
+ self._providers.clear()
564
+
565
+
244
566
  class WorkspaceMCPRuntime(_BuiltinRuntime):
245
567
  """Materialize locked workspace MCP resources for the Harness provider."""
246
568
 
@@ -334,6 +656,9 @@ class WorkspaceMCPRuntime(_BuiltinRuntime):
334
656
  api_key=api_key,
335
657
  tool_filter=tuple(_string_list(materializer.get("toolFilter"))),
336
658
  tool_name_prefix=_optional_string(materializer.get("toolNamePrefix")),
659
+ # McpToolSpec.description 声明为 str:无静态描述时给 "",
660
+ # 不要传 None(下游按 str 消费)。
661
+ description=_optional_string(materializer.get("description")) or "",
337
662
  )
338
663
  )
339
664
  return tuple(specs)
@@ -356,7 +681,9 @@ class WorkspaceMCPRuntime(_BuiltinRuntime):
356
681
  class WorkspaceSkillRuntime(_BuiltinRuntime):
357
682
  """Expose integrity-checked Skill instructions copied into the Bundle."""
358
683
 
359
- def harness_skill(self, bundle: ResolvedPluginBundle) -> HarnessSkillContribution:
684
+ def harness_skills(
685
+ self, bundle: ResolvedPluginBundle
686
+ ) -> tuple[HarnessSkillContribution, ...]:
360
687
  config = self._config(bundle)
361
688
  declared = _resource_entries(config, expected_kind="skill")
362
689
  resolved = _resolved_resources(bundle, "skills")
@@ -381,6 +708,7 @@ class WorkspaceSkillRuntime(_BuiltinRuntime):
381
708
  "builtin_skill_digest_mismatch",
382
709
  f"Skill {name!r} does not match its locked Bundle digest",
383
710
  )
711
+ source_ref = _required_string(entry, "resourceId", code="builtin_skill_invalid")
384
712
  instructions = _required_string(
385
713
  item, "instructions", code="builtin_skill_instructions_missing"
386
714
  )
@@ -389,12 +717,23 @@ class WorkspaceSkillRuntime(_BuiltinRuntime):
389
717
  name=name,
390
718
  instructions=instructions,
391
719
  resource_root=directory,
720
+ source_ref=source_ref,
721
+ content_digest=expected_digest,
392
722
  )
393
723
  )
394
724
  if not contributions:
395
725
  raise PluginHostError(
396
726
  "builtin_skill_resource_missing", "workspace Skill has no locked resource"
397
727
  )
728
+ if len({item.source_ref for item in contributions}) != len(contributions):
729
+ raise PluginHostError(
730
+ "builtin_skill_invalid", "workspace Skills must have unique locked resource IDs"
731
+ )
732
+ return tuple(contributions)
733
+
734
+ def harness_skill(self, bundle: ResolvedPluginBundle) -> HarnessSkillContribution:
735
+ """Retain the singular ABI for existing providers and direct consumers."""
736
+ contributions = self.harness_skills(bundle)
398
737
  if len(contributions) == 1:
399
738
  return contributions[0]
400
739
  return HarnessSkillContribution(
@@ -433,9 +772,30 @@ class ReadOnlyBundleContextRuntime(_BuiltinRuntime):
433
772
  "builtin_context_path_invalid",
434
773
  f"Bundle context path is not a regular file: {relative}",
435
774
  )
775
+ # Resolution verifies the Bundle once; an activation can outlive
776
+ # changes on disk. Authorize and project the same byte snapshot,
777
+ # before truncating it to the configured character budget.
778
+ entry_path = PurePosixPath(relative).as_posix()
779
+ entries = [item for item in bundle.manifest.files if item.path == entry_path]
780
+ try:
781
+ content = path.read_bytes()
782
+ except OSError as error:
783
+ raise PluginHostError(
784
+ "builtin_context_read_failed",
785
+ f"Bundle context file could not be read: {relative}",
786
+ ) from error
787
+ if (
788
+ len(entries) != 1
789
+ or len(content) != entries[0].size
790
+ or "sha256:" + hashlib.sha256(content).hexdigest() != entries[0].sha256
791
+ ):
792
+ raise PluginHostError(
793
+ "builtin_context_source_integrity",
794
+ f"Bundle context file no longer matches its locked bytes: {relative}",
795
+ )
436
796
  try:
437
- text = path.read_text(encoding="utf-8").strip()
438
- except (OSError, UnicodeError) as error:
797
+ text = content.decode("utf-8").strip()
798
+ except UnicodeError as error:
439
799
  raise PluginHostError(
440
800
  "builtin_context_read_failed",
441
801
  f"Bundle context file could not be read: {relative}",
@@ -516,6 +876,18 @@ class SQLiteSessionStoreFactory:
516
876
  return runtime
517
877
 
518
878
 
879
+ class LocalMemoryProviderFactory:
880
+ def __init__(self, state_root: Path):
881
+ self._state_root = state_root.resolve()
882
+
883
+ async def stage(self, manifest, *, profile, services):
884
+ del profile, services
885
+ _require_manifest(manifest, LOCAL_MEMORY_PROVIDER_PLUGIN_ID)
886
+ return LocalMemoryProviderRuntime(
887
+ manifest.metadata.id, manifest.metadata.version, state_root=self._state_root,
888
+ )
889
+
890
+
519
891
  class _WorkspaceMCPFactory:
520
892
  def __init__(self, secret_resolver: SecretResolver | None) -> None:
521
893
  self._secret_resolver = secret_resolver
@@ -571,9 +943,7 @@ def builtin_capability_factories(
571
943
  READ_ONLY_CONTEXT_PLUGIN_ID: _SimpleFactory(
572
944
  READ_ONLY_CONTEXT_PLUGIN_ID, ReadOnlyBundleContextRuntime
573
945
  ),
574
- LOCAL_MEMORY_PROVIDER_PLUGIN_ID: _SimpleFactory(
575
- LOCAL_MEMORY_PROVIDER_PLUGIN_ID, _BuiltinRuntime
576
- ),
946
+ LOCAL_MEMORY_PROVIDER_PLUGIN_ID: LocalMemoryProviderFactory(state_root),
577
947
  CORE_RENDERER_PLUGIN_ID: _SimpleFactory(
578
948
  CORE_RENDERER_PLUGIN_ID, CoreConversationRendererRuntime
579
949
  ),
@@ -588,182 +958,6 @@ def _require_manifest(manifest: PluginManifest, plugin_id: str) -> None:
588
958
  )
589
959
 
590
960
 
591
- def _bound_capability_config(
592
- bundle: ResolvedPluginBundle, plugin_id: str, version: str
593
- ) -> Mapping[str, Any]:
594
- composition = bundle.composition
595
- if composition_profile_digest(composition.profile) != composition.profile_digest:
596
- raise PluginHostError(
597
- "plugin_bundle_profile_mutated",
598
- "resolved Bundle composition profile changed after validation",
599
- )
600
- if plugin_lock_digest(composition.plugin_lock) != composition.plugin_lock_digest:
601
- raise PluginHostError(
602
- "plugin_bundle_lock_mutated",
603
- "resolved Bundle plugin lock changed after validation",
604
- )
605
- ref = f"plugin://{plugin_id}@{version}"
606
- matches = [item for item in composition.profile.capabilities if item.ref == ref]
607
- if len(matches) != 1:
608
- raise PluginHostError(
609
- "builtin_capability_binding_missing",
610
- f"resolved Bundle does not bind built-in capability {plugin_id}@{version}",
611
- )
612
- if not any(
613
- item.id == plugin_id and item.version == version for item in composition.plugin_lock.plugins
614
- ):
615
- raise PluginHostError(
616
- "builtin_capability_lock_missing",
617
- f"resolved Bundle does not lock built-in capability {plugin_id}@{version}",
618
- )
619
- return cast(Mapping[str, Any], matches[0].config)
620
-
621
-
622
- def _resource_entries(
623
- config: Mapping[str, Any], *, expected_kind: str
624
- ) -> tuple[Mapping[str, Any], ...]:
625
- raw = config.get("resources")
626
- if not isinstance(raw, Sequence) or isinstance(raw, (str, bytes)):
627
- raise PluginHostError(
628
- f"builtin_{expected_kind}_config_invalid", "resources must be an array"
629
- )
630
- entries: list[Mapping[str, Any]] = []
631
- for item in raw:
632
- entry = _mapping(item, code=f"builtin_{expected_kind}_config_invalid")
633
- if entry.get("kind") != expected_kind:
634
- raise PluginHostError(
635
- f"builtin_{expected_kind}_resource_mismatch",
636
- f"resource kind must be {expected_kind!r}",
637
- )
638
- for field in ("resourceId", "name", "version", "digest"):
639
- _required_string(entry, field, code=f"builtin_{expected_kind}_invalid")
640
- entries.append(entry)
641
- return tuple(entries)
642
-
643
-
644
- def _resolved_resources(bundle: ResolvedPluginBundle, field: str) -> tuple[Mapping[str, Any], ...]:
645
- capabilities = _mapping(
646
- bundle.resolved_agent_spec.get("capabilities"),
647
- code="builtin_bundle_capabilities_missing",
648
- )
649
- raw = capabilities.get(field)
650
- if not isinstance(raw, Sequence) or isinstance(raw, (str, bytes)):
651
- raise PluginHostError(
652
- "builtin_bundle_capabilities_missing", f"Bundle capabilities.{field} is missing"
653
- )
654
- return tuple(_mapping(item, code="builtin_bundle_capabilities_invalid") for item in raw)
655
-
656
-
657
- def _match_resource(
658
- declared: Mapping[str, Any],
659
- resolved: Sequence[Mapping[str, Any]],
660
- *,
661
- code: str,
662
- ) -> Mapping[str, Any]:
663
- name = _required_string(declared, "name", code=code)
664
- version = _required_string(declared, "version", code=code)
665
- digest = _required_string(declared, "digest", code=code)
666
- matches = [
667
- item
668
- for item in resolved
669
- if item.get("name") == name
670
- and item.get("version") == version
671
- and item.get("digest") == digest
672
- ]
673
- if len(matches) != 1:
674
- raise PluginHostError(
675
- code,
676
- f"locked resource {name!r}@{version} is missing from resolved Agent spec",
677
- )
678
- return matches[0]
679
-
680
-
681
- def _safe_bundle_path(
682
- bundle: ResolvedPluginBundle,
683
- relative_text: str,
684
- *,
685
- code: str,
686
- require_declared: bool,
687
- ) -> Path:
688
- relative = PurePosixPath(relative_text)
689
- if relative.is_absolute() or not relative.parts or ".." in relative.parts:
690
- raise PluginHostError(code, f"unsafe Bundle path: {relative_text}")
691
- path = bundle.root.joinpath(*relative.parts)
692
- cursor = bundle.root
693
- for part in relative.parts:
694
- cursor = cursor / part
695
- if cursor.is_symlink():
696
- raise PluginHostError(code, f"Bundle path cannot use symlinks: {relative_text}")
697
- try:
698
- resolved = path.resolve(strict=True)
699
- resolved.relative_to(bundle.root)
700
- except (OSError, ValueError) as error:
701
- raise PluginHostError(code, f"Bundle path is unavailable: {relative_text}") from error
702
- if require_declared and relative.as_posix() not in {
703
- item.path for item in bundle.manifest.files
704
- }:
705
- raise PluginHostError(code, f"Bundle path is not declared: {relative_text}")
706
- return cast(Path, resolved)
707
-
708
-
709
- def _directory_digest(directory: Path) -> str:
710
- digest = hashlib.sha256()
711
- for path in sorted(item for item in directory.rglob("*") if item.is_file()):
712
- if path.is_symlink():
713
- raise PluginHostError(
714
- "builtin_skill_path_invalid", "Skill Bundle cannot contain symlinks"
715
- )
716
- relative = path.relative_to(directory).as_posix().encode("utf-8")
717
- content = path.read_bytes()
718
- digest.update(len(relative).to_bytes(4, "big"))
719
- digest.update(relative)
720
- digest.update(len(content).to_bytes(8, "big"))
721
- digest.update(content)
722
- return f"sha256:{digest.hexdigest()}"
723
-
724
-
725
- def _mapping(value: Any, *, code: str) -> Mapping[str, Any]:
726
- if not isinstance(value, Mapping):
727
- raise PluginHostError(code, "expected an object")
728
- return value
729
-
730
-
731
- def _required_string(value: Mapping[str, Any], field: str, *, code: str) -> str:
732
- text = value.get(field)
733
- if not isinstance(text, str) or not text.strip():
734
- raise PluginHostError(code, f"{field} must be a non-empty string")
735
- return text.strip()
736
-
737
-
738
- def _optional_string(value: Any) -> str | None:
739
- if value is None:
740
- return None
741
- if not isinstance(value, str):
742
- raise PluginHostError(
743
- "builtin_config_invalid", "optional configuration value must be a string"
744
- )
745
- return value.strip() or None
746
-
747
-
748
- def _string_list(value: Any) -> tuple[str, ...]:
749
- if value is None:
750
- return ()
751
- if not isinstance(value, Sequence) or isinstance(value, (str, bytes)):
752
- raise PluginHostError("builtin_config_invalid", "configuration value must be an array")
753
- result: list[str] = []
754
- for item in value:
755
- if not isinstance(item, str) or not item.strip():
756
- raise PluginHostError(
757
- "builtin_config_invalid", "array entries must be non-empty strings"
758
- )
759
- result.append(item.strip())
760
- return tuple(result)
761
-
762
-
763
- def _is_secret_reference(value: str) -> bool:
764
- return value.startswith(("secret://", "env://", "credential://", "vault://"))
765
-
766
-
767
961
  __all__ = [
768
962
  "BUILTIN_PLUGIN_VERSION",
769
963
  "CORE_RENDERER_PLUGIN_ID",