agentengine-sdk-python 0.8.4__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 (1221) hide show
  1. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +17 -10
  2. agentengine_sdk_python-0.8.6.dist-info/RECORD +1731 -0
  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/_process.py +83 -0
  12. ksadk/_str_enum.py +17 -0
  13. ksadk/a2a/__init__.py +157 -167
  14. ksadk/a2a/_invocation_state.py +86 -0
  15. ksadk/a2a/_space_client_events.py +33 -22
  16. ksadk/a2a/adk.py +194 -0
  17. ksadk/a2a/adk_invocation_context.py +242 -0
  18. ksadk/a2a/adk_runtime.py +126 -0
  19. ksadk/a2a/adk_tools.py +319 -0
  20. ksadk/a2a/bootstrap.py +149 -23
  21. ksadk/a2a/build_validation.py +147 -0
  22. ksadk/a2a/card.py +23 -15
  23. ksadk/a2a/codex.py +160 -0
  24. ksadk/a2a/codex_checkpoint.py +111 -0
  25. ksadk/a2a/codex_recovery.py +96 -0
  26. ksadk/a2a/codex_recovery_events.py +123 -0
  27. ksadk/a2a/codex_runtime.py +198 -0
  28. ksadk/a2a/codex_session_checkpoint.py +162 -0
  29. ksadk/a2a/composition.py +88 -0
  30. ksadk/a2a/context_store.py +118 -19
  31. ksadk/a2a/control_plane.py +108 -106
  32. ksadk/a2a/event_adapter.py +92 -193
  33. ksadk/a2a/executor.py +257 -85
  34. ksadk/a2a/exposure.py +106 -0
  35. ksadk/a2a/external_transport.py +3 -4
  36. ksadk/a2a/identity.py +106 -12
  37. ksadk/a2a/ids.py +14 -3
  38. ksadk/a2a/inbound_kernel.py +133 -0
  39. ksadk/a2a/interaction_wire.py +76 -0
  40. ksadk/a2a/invocation_checkpoint.py +274 -0
  41. ksadk/a2a/invocation_policy.py +87 -0
  42. ksadk/a2a/invocation_publication.py +210 -0
  43. ksadk/a2a/invocation_service.py +972 -0
  44. ksadk/a2a/invocation_types.py +459 -0
  45. ksadk/a2a/kernel_task_adapter.py +259 -0
  46. ksadk/a2a/langgraph.py +20 -7
  47. ksadk/a2a/langgraph_invocation_context.py +136 -0
  48. ksadk/a2a/langgraph_managed.py +150 -0
  49. ksadk/a2a/langgraph_recovery.py +32 -0
  50. ksadk/a2a/langgraph_runtime.py +89 -0
  51. ksadk/a2a/langgraph_tool_runtime.py +132 -0
  52. ksadk/a2a/langgraph_tools.py +63 -0
  53. ksadk/a2a/message_digest.py +40 -0
  54. ksadk/a2a/platform.py +389 -0
  55. ksadk/a2a/policy_refs.py +13 -0
  56. ksadk/a2a/presentation.py +402 -0
  57. ksadk/a2a/product_kernel_facts.py +177 -0
  58. ksadk/a2a/product_key.py +99 -0
  59. ksadk/a2a/protocol_errors.py +116 -0
  60. ksadk/a2a/result_text.py +49 -0
  61. ksadk/a2a/resume_store.py +93 -3
  62. ksadk/a2a/routes.py +6 -1
  63. ksadk/a2a/runtime_approval.py +198 -0
  64. ksadk/a2a/runtime_input.py +151 -0
  65. ksadk/a2a/server.py +16 -7
  66. ksadk/a2a/space_client.py +101 -16
  67. ksadk/a2a/task_adapter.py +19 -5
  68. ksadk/a2a/task_event_dispatcher.py +39 -2
  69. ksadk/a2a/task_event_outbox.py +215 -0
  70. ksadk/a2a/task_event_outbox_owned.py +130 -0
  71. ksadk/a2a/task_store.py +37 -0
  72. ksadk/a2a/tool_activity.py +176 -0
  73. ksadk/a2a/workload_tokens.py +134 -0
  74. ksadk/a2ui/core.py +3 -3
  75. ksadk/api/client.py +38 -79
  76. ksadk/api/sse_stream.py +96 -0
  77. ksadk/builders/code_builder.py +121 -118
  78. ksadk/builders/container_builder.py +11 -29
  79. ksadk/builders/framework_requirements.py +22 -2
  80. ksadk/builders/managed_runtime_builder.py +12 -0
  81. ksadk/builders/source_provenance.py +87 -0
  82. ksadk/cli/__init__.py +36 -0
  83. ksadk/cli/cmd_a2a.py +43 -0
  84. ksadk/cli/cmd_build.py +9 -0
  85. ksadk/cli/cmd_config.py +4 -4
  86. ksadk/cli/cmd_create.py +12 -12
  87. ksadk/cli/cmd_deploy.py +27 -2
  88. ksadk/cli/cmd_hermes.py +24 -2
  89. ksadk/cli/cmd_invoke.py +64 -88
  90. ksadk/cli/cmd_openclaw.py +26 -1
  91. ksadk/cli/cmd_plugin.py +70 -12
  92. ksadk/cli/cmd_studio.py +69 -17
  93. ksadk/cli/cmd_web.py +2 -0
  94. ksadk/cli/hosted_invoke.py +206 -0
  95. ksadk/cli/invoke_content.py +60 -0
  96. ksadk/cli/openclaw_env.py +1 -1
  97. ksadk/cli/resource_common.py +26 -0
  98. ksadk/cli/runtime_bootstrap.py +27 -5
  99. ksadk/codex/_expert_request_reader.py +48 -0
  100. ksadk/codex/a2a_tools.py +140 -0
  101. ksadk/codex/async_approval.py +169 -0
  102. ksadk/codex/async_client.py +938 -0
  103. ksadk/codex/async_proxy.py +216 -0
  104. ksadk/codex/base_runtime.py +25 -0
  105. ksadk/codex/client.py +3 -1047
  106. ksadk/codex/client_payloads.py +85 -0
  107. ksadk/codex/rollout_checkpoint.py +264 -0
  108. ksadk/codex/runtime.py +290 -54
  109. ksadk/common/auth.py +2 -2
  110. ksadk/common/cloud_headers.py +36 -0
  111. ksadk/common/diagnostics.py +34 -0
  112. ksadk/common/kop_client.py +2 -1
  113. ksadk/configs/__init__.py +1 -1
  114. ksadk/configs/env_registry.py +216 -143
  115. ksadk/configs/env_registry_a2a.py +173 -0
  116. ksadk/configs/env_registry_studio.py +134 -0
  117. ksadk/configs/global_config.py +2 -1
  118. ksadk/configs/settings.py +9 -3
  119. ksadk/connector/__init__.py +17 -0
  120. ksadk/connector/channel.py +477 -0
  121. ksadk/context_engine/assembler.py +9 -0
  122. ksadk/context_engine/capabilities.py +52 -4
  123. ksadk/context_engine/contributors.py +80 -17
  124. ksadk/context_engine/instruction_authority.py +18 -0
  125. ksadk/conversations/attachment_storage.py +10 -3
  126. ksadk/conversations/attachments.py +69 -20
  127. ksadk/conversations/contracts.py +28 -9
  128. ksadk/conversations/message_projection.py +51 -155
  129. ksadk/conversations/message_projection_blocks.py +137 -0
  130. ksadk/conversations/model_context.py +11 -3
  131. ksadk/conversations/normalize.py +28 -10
  132. ksadk/conversations/projector.py +63 -0
  133. ksadk/conversations/runtime_baseline.py +37 -0
  134. ksadk/conversations/runtime_compaction.py +7 -2
  135. ksadk/conversations/runtime_input.py +16 -4
  136. ksadk/conversations/runtime_invocation.py +17 -4
  137. ksadk/conversations/runtime_observability.py +39 -10
  138. ksadk/conversations/runtime_payloads.py +12 -0
  139. ksadk/conversations/runtime_persistence.py +296 -32
  140. ksadk/conversations/runtime_preparation.py +98 -13
  141. ksadk/conversations/runtime_projection.py +217 -0
  142. ksadk/conversations/runtime_resume.py +141 -70
  143. ksadk/conversations/runtime_stream_events.py +29 -35
  144. ksadk/conversations/runtime_streaming.py +8 -0
  145. ksadk/conversations/tool_receipt_resume.py +387 -0
  146. ksadk/conversations/tool_receipts.py +32 -0
  147. ksadk/deployment/env_forward.py +5 -0
  148. ksadk/deployment/manager.py +15 -6
  149. ksadk/deployment/providers/serverless.py +76 -136
  150. ksadk/deployment/providers/serverless_payloads.py +122 -0
  151. ksadk/evaluation/agent_eval_client.py +2 -1
  152. ksadk/evaluation/contracts.py +78 -3
  153. ksadk/evaluation/evaluators.py +166 -1
  154. ksadk/evaluation/evidence.py +271 -4
  155. ksadk/evaluation/local_adapter.py +76 -12
  156. ksadk/evaluation/studio_build_adapter.py +73 -9
  157. ksadk/events/adapters/_a2a_checkpoint.py +151 -0
  158. ksadk/events/adapters/_a2a_snapshot.py +18 -14
  159. ksadk/events/adapters/_a2a_support.py +15 -3
  160. ksadk/events/adapters/_a2a_tool_activity.py +123 -0
  161. ksadk/events/adapters/_codex_errors.py +49 -0
  162. ksadk/events/adapters/_codex_items.py +16 -8
  163. ksadk/events/adapters/_langgraph_support.py +46 -1
  164. ksadk/events/adapters/a2a.py +54 -26
  165. ksadk/events/adapters/adk.py +188 -30
  166. ksadk/events/adapters/codex.py +33 -7
  167. ksadk/events/adapters/langgraph.py +16 -6
  168. ksadk/events/canonical.py +5 -0
  169. ksadk/events/canonical_store.py +200 -4
  170. ksadk/events/reducer.py +82 -0
  171. ksadk/events/run_authority.py +176 -0
  172. ksadk/events/session_event.py +2 -2
  173. ksadk/harness/__init__.py +18 -0
  174. ksadk/harness/app.py +11 -0
  175. ksadk/harness/artifact_adapters/__init__.py +1 -0
  176. ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
  177. ksadk/harness/artifact_adapters/native_search.py +249 -0
  178. ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
  179. ksadk/harness/artifact_adapters/native_store.py +115 -0
  180. ksadk/harness/artifact_adapters/native_tool.py +222 -0
  181. ksadk/harness/artifact_store.py +230 -0
  182. ksadk/harness/browser_adapters/__init__.py +6 -0
  183. ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
  184. ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
  185. ksadk/harness/browser_adapters/native_playwright.py +953 -0
  186. ksadk/harness/browser_adapters/native_vision.py +295 -0
  187. ksadk/harness/capabilities.py +115 -0
  188. ksadk/harness/capability_adapters/__init__.py +1 -0
  189. ksadk/harness/capability_adapters/native_dsh.py +289 -0
  190. ksadk/harness/capability_runtime.py +332 -0
  191. ksadk/harness/closure_contract.py +92 -0
  192. ksadk/harness/compaction_record.py +153 -0
  193. ksadk/harness/compiler.py +284 -0
  194. ksadk/harness/config.py +28 -5
  195. ksadk/harness/conformance/__init__.py +33 -0
  196. ksadk/harness/conformance/contract.py +504 -0
  197. ksadk/harness/conformance/fixtures.py +102 -0
  198. ksadk/harness/context_engine.py +388 -0
  199. ksadk/harness/context_maintenance.py +259 -0
  200. ksadk/harness/context_manifest.py +188 -0
  201. ksadk/harness/context_sections.py +397 -0
  202. ksadk/harness/context_tuning.py +168 -0
  203. ksadk/harness/diagnostic_adapters/__init__.py +1 -0
  204. ksadk/harness/diagnostic_adapters/contracts.py +70 -0
  205. ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
  206. ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
  207. ksadk/harness/draft_runtime.py +322 -0
  208. ksadk/harness/engine/__init__.py +40 -0
  209. ksadk/harness/engine/base.py +122 -0
  210. ksadk/harness/engine/budgets.py +108 -0
  211. ksadk/harness/engine/capability_declarations.py +59 -0
  212. ksadk/harness/engine/completion_guard.py +57 -0
  213. ksadk/harness/engine/context_pipeline.py +1351 -0
  214. ksadk/harness/engine/graph_builder.py +352 -0
  215. ksadk/harness/engine/hooked_reasoner.py +380 -0
  216. ksadk/harness/engine/langgraph.py +1049 -0
  217. ksadk/harness/engine/mcp_disclosure.py +701 -0
  218. ksadk/harness/engine/phases/__init__.py +6 -0
  219. ksadk/harness/engine/phases/context.py +48 -0
  220. ksadk/harness/engine/phases/interaction.py +31 -0
  221. ksadk/harness/engine/phases/reason.py +552 -0
  222. ksadk/harness/engine/phases/tools.py +638 -0
  223. ksadk/harness/engine/policy_runtime.py +81 -0
  224. ksadk/harness/engine/postgres_checkpointer.py +386 -0
  225. ksadk/harness/engine/run_control_bridge.py +100 -0
  226. ksadk/harness/engine/run_types.py +98 -0
  227. ksadk/harness/engine/skill_disclosure.py +275 -0
  228. ksadk/harness/engine/spans.py +41 -0
  229. ksadk/harness/engine/steering.py +177 -0
  230. ksadk/harness/engine/subagents.py +360 -0
  231. ksadk/harness/engine/thread_ids.py +112 -0
  232. ksadk/harness/engine/tool_dispatch.py +249 -0
  233. ksadk/harness/event_tree.py +212 -0
  234. ksadk/harness/events.py +498 -0
  235. ksadk/harness/execution_policy.py +104 -0
  236. ksadk/harness/hooks.py +259 -0
  237. ksadk/harness/insights.py +210 -0
  238. ksadk/harness/lifecycle.py +578 -0
  239. ksadk/harness/lifecycle_conformance.py +233 -0
  240. ksadk/harness/lifecycle_local_plane.py +104 -0
  241. ksadk/harness/loop/__init__.py +44 -0
  242. ksadk/harness/loop/reason.py +699 -0
  243. ksadk/harness/loop/tools.py +907 -0
  244. ksadk/harness/managed_runtime.py +1044 -0
  245. ksadk/harness/mcp_disclosure_contract.py +85 -0
  246. ksadk/harness/mcp_matrix.py +474 -0
  247. ksadk/harness/mcp_result_policy.py +44 -0
  248. ksadk/harness/mcp_runtime.py +504 -0
  249. ksadk/harness/memory_consolidation.py +157 -0
  250. ksadk/harness/memory_loop.py +156 -0
  251. ksadk/harness/memory_runtime.py +541 -0
  252. ksadk/harness/metrics.py +90 -0
  253. ksadk/harness/micro_compact.py +69 -0
  254. ksadk/harness/model_adapters/__init__.py +1 -0
  255. ksadk/harness/model_adapters/native_mcp_media.py +100 -0
  256. ksadk/harness/model_adapters/native_mcp_result.py +36 -0
  257. ksadk/harness/model_adapters/native_openai.py +703 -0
  258. ksadk/harness/model_capability.py +468 -0
  259. ksadk/harness/model_provider.py +430 -0
  260. ksadk/harness/multimodal.py +57 -0
  261. ksadk/harness/native/__init__.py +1 -0
  262. ksadk/harness/native/activation_contract.py +25 -0
  263. ksadk/harness/native/activation_recovery.py +29 -0
  264. ksadk/harness/native/adapters.py +291 -0
  265. ksadk/harness/native/artifact_contract.py +14 -0
  266. ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
  267. ksadk/harness/native/artifact_read_capacity.py +182 -0
  268. ksadk/harness/native/artifact_read_contract.py +27 -0
  269. ksadk/harness/native/artifact_runtime.py +408 -0
  270. ksadk/harness/native/artifact_search_capacity.py +206 -0
  271. ksadk/harness/native/artifact_search_contract.py +40 -0
  272. ksadk/harness/native/artifact_single_read_capacity.py +170 -0
  273. ksadk/harness/native/browser_contract.py +229 -0
  274. ksadk/harness/native/browser_recovery.py +183 -0
  275. ksadk/harness/native/capabilities.py +204 -0
  276. ksadk/harness/native/child_approval.py +60 -0
  277. ksadk/harness/native/child_budget.py +136 -0
  278. ksadk/harness/native/child_cancellation.py +80 -0
  279. ksadk/harness/native/child_input.py +98 -0
  280. ksadk/harness/native/child_input_runtime.py +59 -0
  281. ksadk/harness/native/child_interruption.py +81 -0
  282. ksadk/harness/native/child_lifecycle.py +246 -0
  283. ksadk/harness/native/child_lifecycle_contract.py +91 -0
  284. ksadk/harness/native/child_notifications.py +75 -0
  285. ksadk/harness/native/child_promotion.py +66 -0
  286. ksadk/harness/native/command_runtime.py +99 -0
  287. ksadk/harness/native/completion.py +302 -0
  288. ksadk/harness/native/completion_text.py +116 -0
  289. ksadk/harness/native/context.py +358 -0
  290. ksadk/harness/native/context_artifact_page.py +75 -0
  291. ksadk/harness/native/context_compaction_projection.py +131 -0
  292. ksadk/harness/native/context_contributions.py +320 -0
  293. ksadk/harness/native/context_contributor_contract.py +133 -0
  294. ksadk/harness/native/context_driver.py +820 -0
  295. ksadk/harness/native/context_fresh_tools.py +49 -0
  296. ksadk/harness/native/context_history.py +272 -0
  297. ksadk/harness/native/context_microcompact.py +61 -0
  298. ksadk/harness/native/context_partial_summary.py +58 -0
  299. ksadk/harness/native/context_partition.py +492 -0
  300. ksadk/harness/native/context_pruning.py +275 -0
  301. ksadk/harness/native/context_reduction.py +60 -0
  302. ksadk/harness/native/context_replay.py +148 -0
  303. ksadk/harness/native/context_request_projection.py +526 -0
  304. ksadk/harness/native/context_runtime.py +976 -0
  305. ksadk/harness/native/context_runtime_contracts.py +409 -0
  306. ksadk/harness/native/context_search.py +112 -0
  307. ksadk/harness/native/context_source_fragments.py +188 -0
  308. ksadk/harness/native/context_source_progress.py +119 -0
  309. ksadk/harness/native/context_summary_planning.py +788 -0
  310. ksadk/harness/native/context_summary_recovery.py +105 -0
  311. ksadk/harness/native/delivery_review.py +331 -0
  312. ksadk/harness/native/delivery_review_contract.py +54 -0
  313. ksadk/harness/native/effect_admission.py +82 -0
  314. ksadk/harness/native/effect_control.py +318 -0
  315. ksadk/harness/native/effect_receipts.py +729 -0
  316. ksadk/harness/native/effect_runtime.py +303 -0
  317. ksadk/harness/native/effective_configuration.py +28 -0
  318. ksadk/harness/native/engine.py +945 -0
  319. ksadk/harness/native/final_output.py +34 -0
  320. ksadk/harness/native/final_submission.py +58 -0
  321. ksadk/harness/native/finalization_workspace.py +96 -0
  322. ksadk/harness/native/fork.py +151 -0
  323. ksadk/harness/native/guidance.py +91 -0
  324. ksadk/harness/native/history.py +381 -0
  325. ksadk/harness/native/hook_executor.py +205 -0
  326. ksadk/harness/native/hook_runtime_contract.py +282 -0
  327. ksadk/harness/native/interaction_observation.py +117 -0
  328. ksadk/harness/native/lease.py +103 -0
  329. ksadk/harness/native/machine.py +974 -0
  330. ksadk/harness/native/mcp_result_governance.py +156 -0
  331. ksadk/harness/native/model.py +570 -0
  332. ksadk/harness/native/model_feedback.py +63 -0
  333. ksadk/harness/native/model_input.py +30 -0
  334. ksadk/harness/native/model_recovery_contract.py +35 -0
  335. ksadk/harness/native/model_replay.py +128 -0
  336. ksadk/harness/native/model_request.py +133 -0
  337. ksadk/harness/native/model_runtime.py +196 -0
  338. ksadk/harness/native/model_takeover.py +419 -0
  339. ksadk/harness/native/model_tool_batch.py +40 -0
  340. ksadk/harness/native/observed_progress.py +46 -0
  341. ksadk/harness/native/operator_guidance.py +201 -0
  342. ksadk/harness/native/output_contract.py +80 -0
  343. ksadk/harness/native/output_recovery.py +24 -0
  344. ksadk/harness/native/ports.py +749 -0
  345. ksadk/harness/native/precompact_hook_runtime.py +171 -0
  346. ksadk/harness/native/replay_context.py +149 -0
  347. ksadk/harness/native/request_media.py +112 -0
  348. ksadk/harness/native/restore_contract.py +16 -0
  349. ksadk/harness/native/run_clock.py +120 -0
  350. ksadk/harness/native/state.py +436 -0
  351. ksadk/harness/native/steering.py +170 -0
  352. ksadk/harness/native/stop_hook_runtime.py +151 -0
  353. ksadk/harness/native/studio_admission.py +29 -0
  354. ksadk/harness/native/subagents.py +86 -0
  355. ksadk/harness/native/task_policy.py +99 -0
  356. ksadk/harness/native/task_progress.py +86 -0
  357. ksadk/harness/native/terminal_verification.py +43 -0
  358. ksadk/harness/native/tool_argument_feedback.py +178 -0
  359. ksadk/harness/native/tool_budget.py +253 -0
  360. ksadk/harness/native/tool_error_streak.py +89 -0
  361. ksadk/harness/native/tool_hook_runtime.py +343 -0
  362. ksadk/harness/native/tool_input_validation.py +58 -0
  363. ksadk/harness/native/tool_interruption.py +96 -0
  364. ksadk/harness/native/tool_observation.py +259 -0
  365. ksadk/harness/native/tool_progress.py +223 -0
  366. ksadk/harness/native/tool_recovery.py +25 -0
  367. ksadk/harness/native/tool_scheduling.py +33 -0
  368. ksadk/harness/native/tool_schema.py +126 -0
  369. ksadk/harness/native/transitions.py +151 -0
  370. ksadk/harness/native/turn_control.py +98 -0
  371. ksadk/harness/native/user_document.py +98 -0
  372. ksadk/harness/native/user_document_capture.py +49 -0
  373. ksadk/harness/native/user_input.py +87 -0
  374. ksadk/harness/native/verification.py +432 -0
  375. ksadk/harness/native/verification_binding.py +40 -0
  376. ksadk/harness/native/verification_runtime.py +233 -0
  377. ksadk/harness/native/verification_workspace.py +67 -0
  378. ksadk/harness/native_driver_failure.py +123 -0
  379. ksadk/harness/native_facade.py +977 -0
  380. ksadk/harness/native_factory.py +244 -0
  381. ksadk/harness/native_projection.py +503 -0
  382. ksadk/harness/native_runtime.py +621 -0
  383. ksadk/harness/native_shadow.py +250 -0
  384. ksadk/harness/native_shadow_inputs.py +146 -0
  385. ksadk/harness/observability/__init__.py +29 -0
  386. ksadk/harness/observability/inspection.py +528 -0
  387. ksadk/harness/observability/metrics.py +167 -0
  388. ksadk/harness/observability/otel_exporter.py +218 -0
  389. ksadk/harness/progress_adapters/__init__.py +5 -0
  390. ksadk/harness/progress_adapters/native_todo.py +75 -0
  391. ksadk/harness/prompt_cache.py +132 -0
  392. ksadk/harness/public_activity.py +213 -0
  393. ksadk/harness/public_output.py +30 -0
  394. ksadk/harness/public_summary.py +36 -0
  395. ksadk/harness/readiness.py +249 -0
  396. ksadk/harness/reasoner.py +779 -17
  397. ksadk/harness/release_readiness.py +140 -0
  398. ksadk/harness/resource_ref.py +69 -0
  399. ksadk/harness/rpc.py +200 -0
  400. ksadk/harness/run_control.py +773 -0
  401. ksadk/harness/runtime.py +157 -113
  402. ksadk/harness/runtime_capabilities.py +228 -0
  403. ksadk/harness/runtime_server.py +514 -0
  404. ksadk/harness/sandbox_adapters.py +739 -0
  405. ksadk/harness/sandbox_backend.py +733 -0
  406. ksadk/harness/sandbox_conformance.py +288 -0
  407. ksadk/harness/sandbox_lease.py +77 -0
  408. ksadk/harness/sandbox_lease_conformance.py +259 -0
  409. ksadk/harness/sandbox_matrix.py +170 -0
  410. ksadk/harness/sandbox_reconciliation.py +140 -0
  411. ksadk/harness/sandbox_recovery.py +586 -0
  412. ksadk/harness/sandbox_recovery_conformance.py +246 -0
  413. ksadk/harness/sdk.py +153 -0
  414. ksadk/harness/session_store.py +589 -0
  415. ksadk/harness/skill_adapters/__init__.py +1 -0
  416. ksadk/harness/skill_adapters/native_bundle.py +148 -0
  417. ksadk/harness/skill_adapters/native_disclosure.py +306 -0
  418. ksadk/harness/skill_composition.py +212 -0
  419. ksadk/harness/skill_feedback.py +123 -0
  420. ksadk/harness/skill_intent.py +47 -0
  421. ksadk/harness/skill_matrix.py +233 -0
  422. ksadk/harness/skill_runtime.py +317 -0
  423. ksadk/harness/spec.py +342 -0
  424. ksadk/harness/state.py +155 -0
  425. ksadk/harness/stores/__init__.py +14 -0
  426. ksadk/harness/stores/native_command_settlement.py +65 -0
  427. ksadk/harness/stores/native_contract.py +311 -0
  428. ksadk/harness/stores/native_memory.py +326 -0
  429. ksadk/harness/stores/native_memory_archive.py +70 -0
  430. ksadk/harness/stores/native_migration_cli.py +91 -0
  431. ksadk/harness/stores/native_outbox.py +56 -0
  432. ksadk/harness/stores/native_sqlite.py +782 -0
  433. ksadk/harness/stores/native_sqlite_audit.py +29 -0
  434. ksadk/harness/stores/native_sqlite_migration.py +252 -0
  435. ksadk/harness/strategies.py +149 -0
  436. ksadk/harness/subagent.py +263 -0
  437. ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
  438. ksadk/harness/subagent_adapters/native_background_child.py +803 -0
  439. ksadk/harness/subagent_adapters/native_child.py +819 -0
  440. ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
  441. ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
  442. ksadk/harness/subagent_adapters/native_child_result.py +392 -0
  443. ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
  444. ksadk/harness/tool_display.py +75 -0
  445. ksadk/harness/tool_display_contract.py +134 -0
  446. ksadk/harness/tool_output.py +141 -0
  447. ksadk/harness/tool_policy.py +134 -0
  448. ksadk/harness/tool_receipts.py +96 -0
  449. ksadk/harness/tool_reliability.py +81 -0
  450. ksadk/harness/tool_result_policy.py +216 -0
  451. ksadk/harness/tools.py +52 -0
  452. ksadk/harness/user_errors.py +69 -0
  453. ksadk/harness/working_context.py +81 -0
  454. ksadk/harness/working_context_patch.py +99 -0
  455. ksadk/harness/workspace_adapters/__init__.py +6 -0
  456. ksadk/harness/workspace_adapters/native_directory.py +180 -0
  457. ksadk/harness/workspace_adapters/native_git.py +208 -0
  458. ksadk/harness/workspace_adapters/native_isolation.py +350 -0
  459. ksadk/identity/resolver.py +18 -0
  460. ksadk/interaction/__init__.py +1 -1
  461. ksadk/interaction/ledger.py +1 -1
  462. ksadk/interaction/provider.py +1 -1
  463. ksadk/interaction/providers/__init__.py +3 -1
  464. ksadk/interaction/providers/adk.py +1 -1
  465. ksadk/interaction/providers/codex.py +1 -1
  466. ksadk/interaction/providers/harness.py +50 -0
  467. ksadk/interaction/providers/langgraph.py +9 -2
  468. ksadk/kernel/__init__.py +10 -0
  469. ksadk/kernel/approval_presentation.py +91 -0
  470. ksadk/kernel/authorization.py +1 -1
  471. ksadk/kernel/bootstrap.py +220 -252
  472. ksadk/kernel/contract_fingerprints.py +45 -1
  473. ksadk/kernel/contracts.py +30 -0
  474. ksadk/kernel/control.py +180 -29
  475. ksadk/kernel/execution_grants.py +428 -0
  476. ksadk/kernel/execution_grants_memory.py +252 -0
  477. ksadk/kernel/execution_grants_postgres.py +395 -0
  478. ksadk/kernel/execution_grants_sqlite.py +435 -0
  479. ksadk/kernel/execution_host_ingress.py +1071 -0
  480. ksadk/kernel/history_projection.py +120 -0
  481. ksadk/kernel/ingress.py +139 -226
  482. ksadk/kernel/ingress_bootstrap.py +268 -0
  483. ksadk/kernel/legacy_history.py +179 -0
  484. ksadk/kernel/mapping.py +1 -1
  485. ksadk/kernel/memory_store.py +61 -58
  486. ksadk/kernel/memory_store_projection.py +63 -0
  487. ksadk/kernel/postgres_event_log.py +181 -0
  488. ksadk/kernel/postgres_store.py +230 -231
  489. ksadk/kernel/readiness.py +125 -0
  490. ksadk/kernel/recovery.py +166 -16
  491. ksadk/kernel/recovery_projection.py +124 -0
  492. ksadk/kernel/runtime_checkpoint.py +34 -0
  493. ksadk/kernel/sql/001_agent_kernel.sql +28 -0
  494. ksadk/kernel/sqlite_schema.py +100 -0
  495. ksadk/kernel/sqlite_store.py +410 -200
  496. ksadk/kernel/state.py +2 -3
  497. ksadk/kernel/store.py +104 -5
  498. ksadk/kernel/teams_artifact_tools.py +392 -0
  499. ksadk/kernel/teams_effects.py +851 -0
  500. ksadk/kernel/teams_execution_context.py +408 -0
  501. ksadk/kernel/teams_host_http.py +237 -0
  502. ksadk/kernel/teams_material_transport.py +245 -0
  503. ksadk/kernel/teams_materials.py +318 -0
  504. ksadk/kernel/teams_runtime_bootstrap.py +604 -0
  505. ksadk/kernel/teams_tool_runtime.py +273 -0
  506. ksadk/kernel/teams_workspace.py +259 -0
  507. ksadk/kernel/worker.py +369 -340
  508. ksadk/kernel/worker_controls.py +454 -0
  509. ksadk/kernel/worker_history.py +72 -0
  510. ksadk/kernel/worker_identity.py +74 -0
  511. ksadk/kernel/worker_interactions.py +197 -0
  512. ksadk/knowledge_base/client.py +15 -1
  513. ksadk/managed_runtime.py +29 -2
  514. ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
  515. ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
  516. ksadk/memory/adk/bounded_database_session_service.py +232 -0
  517. ksadk/memory/adk/resilient_session_service.py +115 -15
  518. ksadk/memory/adk/short_term_memory.py +8 -9
  519. ksadk/memory/coordinator.py +22 -6
  520. ksadk/memory/extraction.py +159 -7
  521. ksadk/memory/models.py +77 -1
  522. ksadk/memory/provider_resolver.py +5 -0
  523. ksadk/memory/providers/local_candidates.py +183 -0
  524. ksadk/memory/providers/local_postgres.py +200 -0
  525. ksadk/memory/providers/local_sqlite.py +280 -67
  526. ksadk/memory/resolved_policy.py +12 -7
  527. ksadk/memory/retrieval.py +189 -0
  528. ksadk/memory/store_adapter.py +150 -0
  529. ksadk/model_gateway/__init__.py +29 -0
  530. ksadk/model_gateway/client.py +253 -0
  531. ksadk/model_gateway/events.py +113 -0
  532. ksadk/model_gateway/matrix.py +297 -0
  533. ksadk/model_policy.py +2 -2
  534. ksadk/model_proxy/compat.py +670 -0
  535. ksadk/model_proxy/detect.py +254 -0
  536. ksadk/model_proxy/server.py +14 -9
  537. ksadk/model_proxy/transform.py +72 -6
  538. ksadk/plugins/__init__.py +1 -1
  539. ksadk/plugins/bridges/dsh.py +29 -20
  540. ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
  541. ksadk/plugins/builtin_resources.py +199 -0
  542. ksadk/plugins/builtins.py +417 -185
  543. ksadk/plugins/companion_artifacts.py +83 -0
  544. ksadk/plugins/companions.py +368 -0
  545. ksadk/plugins/context_contributor.py +15 -4
  546. ksadk/plugins/contracts.py +1 -1
  547. ksadk/plugins/dsh_channels.py +156 -0
  548. ksadk/plugins/dsh_dependency_policy.py +41 -0
  549. ksadk/plugins/dsh_home.py +140 -0
  550. ksadk/plugins/dsh_teams.py +105 -0
  551. ksadk/plugins/dsh_toolchain.py +92 -21
  552. ksadk/plugins/execution_host.py +107 -0
  553. ksadk/plugins/host.py +73 -5
  554. ksadk/plugins/kernel_adapter.py +44 -1
  555. ksadk/plugins/memory_provider.py +180 -0
  556. ksadk/plugins/providers/_process_group.py +50 -0
  557. ksadk/plugins/providers/bundles/dsh-channels-client/client.js +19 -0
  558. ksadk/plugins/providers/bundles/dsh-channels-client/cordis.patch.yml +3 -0
  559. ksadk/plugins/providers/bundles/dsh-channels-client/index.mjs +7 -0
  560. ksadk/plugins/providers/bundles/dsh-channels-client/package.json +12 -0
  561. ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
  562. ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
  563. ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
  564. ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
  565. ksadk/plugins/providers/bundles/dsh-teams-client/client.js +29 -0
  566. ksadk/plugins/providers/bundles/dsh-teams-client/cordis.patch.yml +3 -0
  567. ksadk/plugins/providers/bundles/dsh-teams-client/index.mjs +11 -0
  568. ksadk/plugins/providers/bundles/dsh-teams-client/package.json +35 -0
  569. ksadk/plugins/providers/bundles/dsh-teams-leader-policy/cordis.patch.yml +3 -0
  570. ksadk/plugins/providers/bundles/dsh-teams-leader-policy/index.mjs +13 -0
  571. ksadk/plugins/providers/bundles/dsh-teams-leader-policy/package.json +27 -0
  572. ksadk/plugins/providers/bundles/dsh-teams-profile/cordis.patch.yml +3 -0
  573. ksadk/plugins/providers/bundles/dsh-teams-profile/index.mjs +12 -0
  574. ksadk/plugins/providers/bundles/dsh-teams-profile/package.json +26 -0
  575. ksadk/plugins/providers/bundles/dsh-teams-router/cordis.patch.yml +3 -0
  576. ksadk/plugins/providers/bundles/dsh-teams-router/index.mjs +16 -0
  577. ksadk/plugins/providers/bundles/dsh-teams-router/package.json +27 -0
  578. ksadk/plugins/providers/bundles/dsh-teams-tasks/cordis.patch.yml +3 -0
  579. ksadk/plugins/providers/bundles/dsh-teams-tasks/index.mjs +16 -0
  580. ksadk/plugins/providers/bundles/dsh-teams-tasks/package.json +27 -0
  581. ksadk/plugins/providers/bundles/dsh-teams-tools/cordis.patch.yml +3 -0
  582. ksadk/plugins/providers/bundles/dsh-teams-tools/index.mjs +25 -0
  583. ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +29 -0
  584. ksadk/plugins/providers/bundles/dsh-teams-tools/tools.json +235 -0
  585. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +1 -1
  586. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +51 -1
  587. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +2 -2
  588. ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/client.mjs +133 -0
  589. ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/index.mjs +14 -0
  590. ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +27 -4
  591. ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +9 -5
  592. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
  593. ksadk/plugins/providers/codex.py +52 -40
  594. ksadk/plugins/providers/codex_native.py +20 -0
  595. ksadk/plugins/providers/codex_skills.py +46 -0
  596. ksadk/plugins/providers/dsh_capabilities.py +49 -143
  597. ksadk/plugins/providers/dsh_connector_lease.py +225 -0
  598. ksadk/plugins/providers/dsh_mcp.py +163 -1
  599. ksadk/plugins/providers/harness.py +413 -52
  600. ksadk/plugins/providers/harness_context.py +61 -0
  601. ksadk/plugins/providers/harness_contributions.py +241 -0
  602. ksadk/plugins/providers/harness_delegation.py +670 -0
  603. ksadk/plugins/providers/harness_hooks.py +121 -0
  604. ksadk/plugins/providers/harness_managed.py +550 -0
  605. ksadk/plugins/providers/harness_tools.py +455 -0
  606. ksadk/plugins/providers/legacy_catalog.py +1 -1
  607. ksadk/plugins/providers/mcp_projection.py +100 -3
  608. ksadk/plugins/providers/platform_resources.py +16 -6
  609. ksadk/plugins/providers/shipped_dsh.py +4 -1
  610. ksadk/plugins/subagent_providers/codex.py +28 -6
  611. ksadk/plugins/teams/__init__.py +5 -0
  612. ksadk/plugins/teams/api.py +405 -0
  613. ksadk/plugins/teams/application.py +540 -0
  614. ksadk/plugins/teams/artifacts.py +60 -0
  615. ksadk/plugins/teams/build_artifacts.py +460 -0
  616. ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
  617. ksadk/plugins/teams/cloud_contracts.py +928 -0
  618. ksadk/plugins/teams/cloud_permits.py +250 -0
  619. ksadk/plugins/teams/context.py +96 -0
  620. ksadk/plugins/teams/contracts.py +136 -0
  621. ksadk/plugins/teams/domain.py +1480 -0
  622. ksadk/plugins/teams/domain_values.py +24 -0
  623. ksadk/plugins/teams/effect_contracts.py +255 -0
  624. ksadk/plugins/teams/errors.py +13 -0
  625. ksadk/plugins/teams/execution_projection.py +255 -0
  626. ksadk/plugins/teams/leader_decisions.py +106 -0
  627. ksadk/plugins/teams/migration.py +311 -0
  628. ksadk/plugins/teams/migration_cli.py +322 -0
  629. ksadk/plugins/teams/postgres_store.py +352 -0
  630. ksadk/plugins/teams/release_contracts.py +60 -0
  631. ksadk/plugins/teams/runtime.py +853 -0
  632. ksadk/plugins/teams/source_projection.py +84 -0
  633. ksadk/plugins/teams/store.py +519 -0
  634. ksadk/plugins/teams/task_decisions.py +436 -0
  635. ksadk/plugins/teams/tool_service.py +152 -0
  636. ksadk/plugins/teams/transport.py +96 -0
  637. ksadk/plugins/teams/workspaces.py +255 -0
  638. ksadk/resource_runtime/skill_runtime.py +3 -0
  639. ksadk/resource_runtime/socket_server.py +11 -0
  640. ksadk/resource_runtime/worker.py +28 -4
  641. ksadk/runners/_adk_a2a_stream.py +122 -0
  642. ksadk/runners/_adk_canonical_stream.py +474 -0
  643. ksadk/runners/_langgraph_canonical_streams.py +527 -0
  644. ksadk/runners/_langgraph_runner_streams.py +83 -401
  645. ksadk/runners/_langgraph_state_reader.py +106 -0
  646. ksadk/runners/_langgraph_tool_projection.py +86 -0
  647. ksadk/runners/_langgraph_tools_transformer.py +27 -0
  648. ksadk/runners/_session_identity.py +285 -0
  649. ksadk/runners/adk_runner.py +220 -350
  650. ksadk/runners/base_runner.py +6 -5
  651. ksadk/runners/langgraph_runner.py +208 -195
  652. ksadk/runners/patch_langchain.py +47 -0
  653. ksadk/runners/usage_accumulator.py +11 -3
  654. ksadk/runners/utils/loader.py +28 -14
  655. ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
  656. ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
  657. ksadk/runtime/_runner_adapter/stream_mapping.py +134 -129
  658. ksadk/runtime/adapter.py +40 -3
  659. ksadk/runtime/conversation_execution.py +29 -3
  660. ksadk/runtime/executor.py +105 -7
  661. ksadk/runtime/factory.py +45 -3
  662. ksadk/runtime/framework_adapters.py +184 -10
  663. ksadk/runtime/hosted_finalizer.py +4 -6
  664. ksadk/runtime/launch.py +2 -0
  665. ksadk/runtime/preprocessing.py +11 -3
  666. ksadk/runtime/runner_adapter.py +160 -21
  667. ksadk/runtime/skill_eval_result.py +36 -0
  668. ksadk/runtime/timing.py +46 -0
  669. ksadk/runtime/usage.py +49 -18
  670. ksadk/runtime_context.py +105 -1
  671. ksadk/sandbox/backends/e2b.py +272 -24
  672. ksadk/sandbox/backends/local_process.py +73 -39
  673. ksadk/sandbox/base.py +62 -1
  674. ksadk/sandbox/diagnostics.py +82 -0
  675. ksadk/sandbox/e2b_connection.py +9 -1
  676. ksadk/sandbox/local_controls.py +776 -0
  677. ksadk/sandbox/local_launcher.py +124 -0
  678. ksadk/scheduler/dispatcher.py +1 -1
  679. ksadk/server/factory.py +178 -25
  680. ksadk/server/history_deadline.py +158 -0
  681. ksadk/server/history_page_cache.py +129 -0
  682. ksadk/server/invocation_identity.py +118 -0
  683. ksadk/server/routes/checkpoint_audit.py +88 -0
  684. ksadk/server/routes/checkpoint_listing.py +294 -0
  685. ksadk/server/routes/checkpoint_resolution.py +73 -20
  686. ksadk/server/routes/common.py +32 -3
  687. ksadk/server/routes/control.py +112 -9
  688. ksadk/server/routes/dependencies.py +2 -1
  689. ksadk/server/routes/display_projection.py +154 -0
  690. ksadk/server/routes/kernel_ingress.py +26 -3
  691. ksadk/server/routes/misc.py +331 -33
  692. ksadk/server/routes/models.py +28 -4
  693. ksadk/server/routes/openai_compat.py +82 -13
  694. ksadk/server/routes/projection.py +159 -216
  695. ksadk/server/routes/run.py +112 -37
  696. ksadk/server/routes/sessions.py +493 -358
  697. ksadk/server/routes/streaming.py +68 -15
  698. ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
  699. ksadk/server/routes/workspace.py +135 -23
  700. ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-CILaW-fC.js} +1 -1
  701. ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-BVrNVtJC.js} +10 -7
  702. ksadk/server/static/assets/MathMessageMarkdown-Dp7c4wWD.js +8 -0
  703. ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-Dxop8Rd7.js} +9 -9
  704. ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
  705. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
  706. ksadk/server/static/assets/{arc-bTohInsS.js → arc-DqxJede-.js} +1 -1
  707. ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
  708. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
  709. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
  710. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
  711. ksadk/server/static/assets/channel-fySsnkft.js +1 -0
  712. ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
  713. ksadk/server/static/assets/{chunk-5VM5RSS4-DkhehZDr.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
  714. ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
  715. ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
  716. ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
  717. ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
  718. ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
  719. ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
  720. ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
  721. ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
  722. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
  723. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
  724. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-Bf9D3tzJ.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
  725. ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
  726. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
  727. ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
  728. ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-DfvnEf45.js} +1 -1
  729. ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
  730. ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
  731. ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
  732. ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
  733. ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
  734. ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-0uJ4tdx6.js} +1 -1
  735. ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-AEv-vXf-.js} +1 -1
  736. ksadk/server/static/assets/{dist-BgV_owcB.js → dist-B49GzZDb.js} +1 -1
  737. ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B8Myiet9.js} +1 -1
  738. ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-BBsYarrI.js} +2 -2
  739. ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BQMrUwdI.js} +1 -1
  740. ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-BX_-FENW.js} +1 -1
  741. ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-CD4L6ymH.js} +1 -1
  742. ksadk/server/static/assets/{dist-Cf125P_m.js → dist-CHpW1BHj.js} +1 -1
  743. ksadk/server/static/assets/{dist-DVCOWtha.js → dist-CVPau3tn.js} +1 -1
  744. ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-C_qdxcSH.js} +1 -1
  745. ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-Co68Apq4.js} +1 -1
  746. ksadk/server/static/assets/{dist-DiixqL0J.js → dist-Cp2PaOMY.js} +1 -1
  747. ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-CuR5Bgme.js} +1 -1
  748. ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-DDSyLEOX.js} +1 -1
  749. ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-DUxO0R99.js} +1 -1
  750. ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-QzbGrED_.js} +1 -1
  751. ksadk/server/static/assets/dist-bupkyEBZ.js +1 -0
  752. ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-cxTGfdqx.js} +1 -1
  753. ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-hL5p1til.js} +1 -1
  754. ksadk/server/static/assets/{dist-btbmmX5O.js → dist-lOy23y43.js} +1 -1
  755. ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-pq-nD33R.js} +1 -1
  756. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
  757. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
  758. ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
  759. ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
  760. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
  761. ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
  762. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
  763. ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
  764. ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
  765. ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
  766. ksadk/server/static/assets/{infoDiagram-RXCK75RN-CO0rRTRA.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
  767. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
  768. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
  769. ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
  770. ksadk/server/static/assets/{katex-B4weu383.js → katex-BT-X-V7U.js} +1 -1
  771. ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-DTR631iG.js} +1 -1
  772. ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
  773. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
  774. ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
  775. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-D7genGLl.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
  776. ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
  777. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
  778. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
  779. ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
  780. ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
  781. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
  782. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
  783. ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
  784. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-CCsh3avW.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
  785. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
  786. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
  787. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
  788. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
  789. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
  790. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
  791. ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
  792. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
  793. ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
  794. ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
  795. ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
  796. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BSKgJsmR.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
  797. ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
  798. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
  799. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
  800. ksadk/server/static/index.html +2 -2
  801. ksadk/server/terminal_sessions.py +34 -2
  802. ksadk/sessions/__init__.py +8 -1
  803. ksadk/sessions/_checkpoint_resume_audit.py +44 -0
  804. ksadk/sessions/_in_memory_query.py +112 -0
  805. ksadk/sessions/_local_service_sync.py +157 -156
  806. ksadk/sessions/_local_state_sync.py +152 -0
  807. ksadk/sessions/_local_tables.py +2 -0
  808. ksadk/sessions/_postgres_checkpoint_read.py +323 -0
  809. ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
  810. ksadk/sessions/_postgres_history_read.py +678 -0
  811. ksadk/sessions/_postgres_schema.py +44 -2
  812. ksadk/sessions/_postgres_tables.py +2 -0
  813. ksadk/sessions/_postgres_tool_receipts.py +169 -0
  814. ksadk/sessions/_resilient_read.py +630 -0
  815. ksadk/sessions/_tool_receipt_sync.py +119 -0
  816. ksadk/sessions/agent_identity.py +16 -0
  817. ksadk/sessions/base.py +278 -0
  818. ksadk/sessions/db_budget.py +332 -0
  819. ksadk/sessions/errors.py +12 -0
  820. ksadk/sessions/history_budget.py +36 -0
  821. ksadk/sessions/history_identity.py +27 -0
  822. ksadk/sessions/in_memory.py +376 -113
  823. ksadk/sessions/invocation_identity.py +235 -0
  824. ksadk/sessions/local_service.py +345 -0
  825. ksadk/sessions/postgres_service.py +515 -549
  826. ksadk/sessions/resilience.py +21 -14
  827. ksadk/sessions/resilient.py +611 -504
  828. ksadk/skills/__init__.py +26 -0
  829. ksadk/skills/events.py +464 -0
  830. ksadk/skills/loader.py +44 -2
  831. ksadk/skills/manifest_cache.py +263 -0
  832. ksadk/skills/mcp_server/__init__.py +0 -0
  833. ksadk/skills/mcp_server/_registry.py +33 -0
  834. ksadk/skills/mcp_server/_routing.py +26 -0
  835. ksadk/skills/mcp_server/_workspace_files.py +160 -0
  836. ksadk/skills/mcp_server/register.py +415 -0
  837. ksadk/skills/mcp_server/server.py +218 -0
  838. ksadk/skills/models.py +11 -0
  839. ksadk/skills/observability.py +132 -0
  840. ksadk/skills/package_store.py +75 -2
  841. ksadk/skills/runtime/agent.py +38 -5
  842. ksadk/skills/runtime/artifacts.py +87 -0
  843. ksadk/skills/runtime/backends/e2b.py +400 -56
  844. ksadk/skills/runtime/backends/local.py +621 -119
  845. ksadk/skills/runtime/base.py +78 -7
  846. ksadk/skills/runtime/executor.py +266 -1
  847. ksadk/skills/runtime/loader.py +108 -3
  848. ksadk/skills/runtime/request.py +18 -0
  849. ksadk/skills/service_client.py +6 -1
  850. ksadk/skills/tool_defs.py +108 -3
  851. ksadk/studio/a2a_bindings.py +407 -0
  852. ksadk/studio/a2a_orchestration.py +178 -0
  853. ksadk/studio/active_run_output.py +92 -0
  854. ksadk/studio/activity_records.py +542 -0
  855. ksadk/studio/agent_configuration.py +173 -0
  856. ksadk/studio/api.py +784 -419
  857. ksadk/studio/api_a2a_routes.py +93 -0
  858. ksadk/studio/api_catalog_routes.py +13 -0
  859. ksadk/studio/api_cloud_chat_routes.py +382 -0
  860. ksadk/studio/api_contracts.py +31 -2
  861. ksadk/studio/api_plugin_routes.py +39 -12
  862. ksadk/studio/api_resource_connections.py +79 -41
  863. ksadk/studio/attachment_store.py +14 -2
  864. ksadk/studio/authoring.py +12 -6
  865. ksadk/studio/authoring_coordinator.py +4 -2
  866. ksadk/studio/build_resolution.py +117 -0
  867. ksadk/studio/build_singleflight.py +37 -0
  868. ksadk/studio/builder.py +32 -2
  869. ksadk/studio/capabilities.py +31 -9
  870. ksadk/studio/channel_connections.py +333 -0
  871. ksadk/studio/cloud.py +113 -387
  872. ksadk/studio/cloud_gateways.py +424 -0
  873. ksadk/studio/cloud_shared_web.py +82 -2
  874. ksadk/studio/codex_agent_service.py +19 -2
  875. ksadk/studio/codex_builder.py +1 -1
  876. ksadk/studio/codex_manifest.py +5 -1
  877. ksadk/studio/codex_provider_build.py +65 -0
  878. ksadk/studio/codex_run.py +6 -1
  879. ksadk/studio/compiler.py +112 -6
  880. ksadk/studio/configuration.py +182 -0
  881. ksadk/studio/contract_base.py +19 -0
  882. ksadk/studio/contracts.py +260 -202
  883. ksadk/studio/dsh_application.py +183 -27
  884. ksadk/studio/dsh_capability_service.py +302 -189
  885. ksadk/studio/dsh_lifecycle.py +58 -0
  886. ksadk/studio/dsh_mcp_transport.py +191 -0
  887. ksadk/studio/dsh_provider_registration.py +55 -16
  888. ksadk/studio/entry.py +53 -0
  889. ksadk/studio/event_store.py +53 -5
  890. ksadk/studio/execution_host.py +598 -0
  891. ksadk/studio/framework_run.py +50 -10
  892. ksadk/studio/hosted_kernel.py +1 -1
  893. ksadk/studio/interaction_submission.py +265 -0
  894. ksadk/studio/kernel_registry.py +429 -0
  895. ksadk/studio/kernel_sqlite_migration.py +181 -0
  896. ksadk/studio/lifecycle_status.py +43 -0
  897. ksadk/studio/model_buffered_wire.py +227 -0
  898. ksadk/studio/model_chat_tools.py +143 -0
  899. ksadk/studio/model_client.py +1939 -345
  900. ksadk/studio/model_content_stream.py +129 -0
  901. ksadk/studio/model_credentials.py +196 -0
  902. ksadk/studio/model_profile_service.py +89 -40
  903. ksadk/studio/model_request_projection.py +284 -0
  904. ksadk/studio/model_responses_content.py +296 -0
  905. ksadk/studio/model_usage.py +109 -0
  906. ksadk/studio/model_wire_failure.py +110 -0
  907. ksadk/studio/model_wire_identity.py +138 -0
  908. ksadk/studio/model_wire_snapshot.py +45 -0
  909. ksadk/studio/model_wire_tools.py +283 -0
  910. ksadk/studio/native_acceptance.py +68 -0
  911. ksadk/studio/native_approval.py +111 -0
  912. ksadk/studio/native_browser_port.py +861 -0
  913. ksadk/studio/native_child_mcp.py +87 -0
  914. ksadk/studio/native_child_publication.py +68 -0
  915. ksadk/studio/native_child_skills.py +72 -0
  916. ksadk/studio/native_child_workspace.py +176 -0
  917. ksadk/studio/native_command_policy.py +53 -0
  918. ksadk/studio/native_context_port.py +326 -0
  919. ksadk/studio/native_context_registration.py +54 -0
  920. ksadk/studio/native_document_input.py +88 -0
  921. ksadk/studio/native_documents.py +172 -0
  922. ksadk/studio/native_final_shape.py +852 -0
  923. ksadk/studio/native_gateway_stream.py +69 -0
  924. ksadk/studio/native_hook_port.py +145 -0
  925. ksadk/studio/native_hook_registration.py +70 -0
  926. ksadk/studio/native_inventory_disclosure.py +223 -0
  927. ksadk/studio/native_kernel_admission.py +84 -0
  928. ksadk/studio/native_language_diagnostics.py +320 -0
  929. ksadk/studio/native_mcp_disclosure.py +198 -0
  930. ksadk/studio/native_mcp_tool_port.py +219 -0
  931. ksadk/studio/native_memory_acceptance.py +362 -0
  932. ksadk/studio/native_memory_context.py +266 -0
  933. ksadk/studio/native_memory_flush.py +174 -0
  934. ksadk/studio/native_memory_sources.py +80 -0
  935. ksadk/studio/native_memory_tool_port.py +360 -0
  936. ksadk/studio/native_memory_turn.py +183 -0
  937. ksadk/studio/native_model_port.py +765 -0
  938. ksadk/studio/native_model_recovery.py +126 -0
  939. ksadk/studio/native_options.py +75 -0
  940. ksadk/studio/native_output_fields.py +58 -0
  941. ksadk/studio/native_planning.py +156 -0
  942. ksadk/studio/native_product.py +988 -0
  943. ksadk/studio/native_read_budget.py +426 -0
  944. ksadk/studio/native_recovery.py +171 -0
  945. ksadk/studio/native_scope.py +35 -0
  946. ksadk/studio/native_session_context_port.py +141 -0
  947. ksadk/studio/native_session_engine.py +14 -0
  948. ksadk/studio/native_skill_source.py +74 -0
  949. ksadk/studio/native_subagent_port.py +700 -0
  950. ksadk/studio/native_terminal_recovery.py +95 -0
  951. ksadk/studio/native_test_action.py +610 -0
  952. ksadk/studio/native_tool_port.py +477 -0
  953. ksadk/studio/native_user_input.py +60 -0
  954. ksadk/studio/native_verification_presentation.py +65 -0
  955. ksadk/studio/native_workspace_diagnostics.py +183 -0
  956. ksadk/studio/native_workspace_port.py +43 -0
  957. ksadk/studio/operations.py +34 -9
  958. ksadk/studio/plugin_composition.py +39 -12
  959. ksadk/studio/plugin_kernel_adapter.py +89 -0
  960. ksadk/studio/plugin_lifecycle.py +80 -0
  961. ksadk/studio/plugin_native_activation.py +163 -0
  962. ksadk/studio/plugin_runtime.py +832 -99
  963. ksadk/studio/plugin_runtime_admission.py +57 -0
  964. ksadk/studio/presentation.py +92 -0
  965. ksadk/studio/provider_recovery.py +59 -0
  966. ksadk/studio/public_output_store.py +69 -0
  967. ksadk/studio/recovery_page.py +70 -0
  968. ksadk/studio/resource_authority.py +69 -34
  969. ksadk/studio/resource_catalog.py +14 -12
  970. ksadk/studio/run_activity.py +848 -0
  971. ksadk/studio/run_controls.py +185 -0
  972. ksadk/studio/run_documents.py +127 -0
  973. ksadk/studio/run_service.py +1220 -335
  974. ksadk/studio/run_submission_receipts.py +68 -0
  975. ksadk/studio/runtime_catalog.py +73 -11
  976. ksadk/studio/runtime_prewarm.py +22 -0
  977. ksadk/studio/runtime_source.py +1 -1
  978. ksadk/studio/scheduler_assistant.py +4 -1
  979. ksadk/studio/scheduler_runtime.py +32 -289
  980. ksadk/studio/service.py +615 -246
  981. ksadk/studio/service_settings.py +229 -0
  982. ksadk/studio/shared_web.py +518 -181
  983. ksadk/studio/shared_web_response_events.py +180 -0
  984. ksadk/studio/shared_web_run_state.py +133 -0
  985. ksadk/studio/skill_discovery.py +305 -3
  986. ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
  987. ksadk/studio/static/assets/CodeBlock-DMIf4h33-CkufcPYo.js +44 -0
  988. ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
  989. ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js +8 -0
  990. ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
  991. ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-BeyLyQHu.js +59 -0
  992. ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
  993. ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
  994. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-Bnb1O3tA.js +1 -0
  995. ksadk/studio/static/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
  996. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-5Zn1gqJv.js +36 -0
  997. ksadk/studio/static/assets/{blockDiagram-I7D4REHJ-CFmPl1de.js → blockDiagram-I7D4REHJ-CLB4L11u.js} +6 -6
  998. ksadk/studio/static/assets/{c4Diagram-7LVT6UL2-BRrGu8qt.js → c4Diagram-7LVT6UL2-BOma_Z_F.js} +7 -7
  999. ksadk/studio/static/assets/channel-r8itPEik.js +1 -0
  1000. ksadk/studio/static/assets/chunk-2E4U76K2-BFf_huql.js +2 -0
  1001. ksadk/studio/static/assets/chunk-2ZTRR5NV-C2qZJila.js +2 -0
  1002. ksadk/studio/static/assets/chunk-3Z5EZCMW-DMniOlPd.js +1 -0
  1003. ksadk/studio/static/assets/{chunk-4HAMMTFA-D220vUtq.js → chunk-4HAMMTFA-DVtDP4rm.js} +7 -7
  1004. ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
  1005. ksadk/studio/static/assets/chunk-6AZGARVD-BB6FqMl-.js +1 -0
  1006. ksadk/studio/static/assets/chunk-6EIED4P4-DdUJkP0f.js +1 -0
  1007. ksadk/studio/static/assets/chunk-6K3QC6MW-CqVsVn-y.js +1 -0
  1008. ksadk/studio/static/assets/chunk-6TQVIW2G-DKlLbNIP.js +1 -0
  1009. ksadk/studio/static/assets/chunk-747NJXEK-BFkZPlab.js +2 -0
  1010. ksadk/studio/static/assets/chunk-75Z2AOVW-BZNhM4vB.js +2 -0
  1011. ksadk/studio/static/assets/chunk-CLGD4ZFX-D-GTtyKs.js +1 -0
  1012. ksadk/studio/static/assets/{chunk-DU6HZSFF-C4DtVpCu.js → chunk-DU6HZSFF-CpEZCUgg.js} +1 -1
  1013. ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
  1014. ksadk/studio/static/assets/{chunk-GMAD6QVW-DiQA-u2N.js → chunk-GMAD6QVW-DE_8H717.js} +6 -6
  1015. ksadk/studio/static/assets/chunk-GVQU2GXP-BfEB0lNv.js +1 -0
  1016. ksadk/studio/static/assets/chunk-I5DQTOEV-Hm2LfiYI.js +1 -0
  1017. ksadk/studio/static/assets/chunk-ICYGCRZG-749o-pGJ.js +1 -0
  1018. ksadk/studio/static/assets/chunk-IH6LHLGP-CC6I9F3i.js +1 -0
  1019. ksadk/studio/static/assets/{chunk-IMKFNOWR-BSlbjT_b.js → chunk-IMKFNOWR-D38axYOR.js} +5 -5
  1020. ksadk/studio/static/assets/chunk-KI3K4JFJ-Rma-0k_M.js +1 -0
  1021. ksadk/studio/static/assets/chunk-L3NEJ4N5-Dq5xn7aL.js +1 -0
  1022. ksadk/studio/static/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
  1023. ksadk/studio/static/assets/{chunk-OSK3NFVY-M2m6G3j4.js → chunk-OSK3NFVY-DiCQjx9b.js} +5 -5
  1024. ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
  1025. ksadk/studio/static/assets/{chunk-P2QGCYS3-DezaQxiK.js → chunk-P2QGCYS3-VdhKmfYq.js} +1 -1
  1026. ksadk/studio/static/assets/chunk-POPQ4Y6H-C1_rzO5M.js +1 -0
  1027. ksadk/studio/static/assets/chunk-PWAF6VOD-B45HvflI.js +1 -0
  1028. ksadk/studio/static/assets/{chunk-SHT3W25Y-DAyIVp5H.js → chunk-SHT3W25Y-DsCFnRVE.js} +9 -9
  1029. ksadk/studio/static/assets/{chunk-SVP7TREG-DulomOrS.js → chunk-SVP7TREG-DljApgRX.js} +1 -1
  1030. ksadk/studio/static/assets/{chunk-TICWLB2K-bHJYoflj.js → chunk-TICWLB2K-DWqRtyqa.js} +6 -6
  1031. ksadk/studio/static/assets/chunk-TLUHSLCS-DUeGgnD5.js +2 -0
  1032. ksadk/studio/static/assets/chunk-UY3FDG6J-CnmaAkG5.js +1 -0
  1033. ksadk/studio/static/assets/chunk-XHIXRSVI-BFQ6B8BE.js +1 -0
  1034. ksadk/studio/static/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
  1035. ksadk/studio/static/assets/classDiagram-ZZMXUADV-DjeMNJmu.js +1 -0
  1036. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-DjeMNJmu.js +1 -0
  1037. ksadk/studio/static/assets/clsx-DB0hHKMi.js +1 -0
  1038. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-om8AY0Mc.js +1 -0
  1039. ksadk/studio/static/assets/createLucideIcon-DR0LGTP5.js +1 -0
  1040. ksadk/studio/static/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
  1041. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-6BrmK52S.js +62 -0
  1042. ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
  1043. ksadk/studio/static/assets/{diagram-S7CK7UJ4-0BZ98mya.js → diagram-S7CK7UJ4-C6aH78c4.js} +3 -3
  1044. ksadk/studio/static/assets/diagram-UQ7AKVKN-DY_tQ6C_.js +41 -0
  1045. ksadk/studio/static/assets/diagram-VSXAHHWV-DX9p5cQT.js +3 -0
  1046. ksadk/studio/static/assets/diagram-VX7I27RA-DB2WSH8X.js +24 -0
  1047. ksadk/studio/static/assets/diagram-Z3DM3KII-Ce1BJwHE.js +24 -0
  1048. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
  1049. ksadk/studio/static/assets/{erDiagram-RLTQ6QDP-DLGry2Ap.js → erDiagram-RLTQ6QDP-CGthTMmJ.js} +6 -6
  1050. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
  1051. ksadk/studio/static/assets/flowDiagram-HODETNUW-CZ1tEenp.js +1 -0
  1052. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BfoAZW9X.js +292 -0
  1053. ksadk/studio/static/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
  1054. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-S985OIJF.js +106 -0
  1055. ksadk/studio/static/assets/iconfont-4HN3C9Pg.woff2 +0 -0
  1056. ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
  1057. ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
  1058. ksadk/studio/static/assets/index.dom-BQenBtFm.js +1 -0
  1059. ksadk/studio/static/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
  1060. ksadk/studio/static/assets/infoDiagram-27XIBGKW-CO3W8tFn.js +2 -0
  1061. ksadk/studio/static/assets/{ishikawaDiagram-5VMMS53U-CljI2wyf.js → ishikawaDiagram-5VMMS53U-BUGEl8cO.js} +2 -2
  1062. ksadk/studio/static/assets/{journeyDiagram-3NMN7TZE-D50Fo2sL.js → journeyDiagram-3NMN7TZE-Ch2ZYxvr.js} +6 -6
  1063. ksadk/studio/static/assets/{kanban-definition-UXKFOSKX-DimfOTam.js → kanban-definition-UXKFOSKX-Da-Fp4vC.js} +3 -3
  1064. ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
  1065. ksadk/studio/static/assets/{line-CX5BOOUP.js → line-BDaeq300.js} +1 -1
  1066. ksadk/studio/static/assets/linear-DmucvK78.js +1 -0
  1067. ksadk/studio/static/assets/mermaid-parser.core-Cj5mYdBi.js +4 -0
  1068. ksadk/studio/static/assets/{mindmap-definition-YA3MSWOX-Bizzqy5R.js → mindmap-definition-YA3MSWOX-CvlsVQ38.js} +1 -1
  1069. ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
  1070. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-BuHuNgT5.js +1 -0
  1071. ksadk/studio/static/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
  1072. ksadk/studio/static/assets/{pieDiagram-E7YTZNPT-B9mrFSDF.js → pieDiagram-E7YTZNPT-DlrWiSOv.js} +1 -1
  1073. ksadk/studio/static/assets/preload-helper-CO68xz6u.js +1 -0
  1074. ksadk/studio/static/assets/presentation-yYw7xK60-BmcZriri.js +1 -0
  1075. ksadk/studio/static/assets/{quadrantDiagram-AXDQQJYC-NzUfCbMR.js → quadrantDiagram-AXDQQJYC-BA3hpUZM.js} +6 -6
  1076. ksadk/studio/static/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
  1077. ksadk/studio/static/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
  1078. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
  1079. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
  1080. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
  1081. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-BxpAazym.js +1 -0
  1082. ksadk/studio/static/assets/{requirementDiagram-BXWQKSXE-BF3d103U.js → requirementDiagram-BXWQKSXE-E-Ge0FcV.js} +1 -1
  1083. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
  1084. ksadk/studio/static/assets/{sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js → sequenceDiagram-WJ2MYXX4-CcElXGg4.js} +9 -9
  1085. ksadk/studio/static/assets/src-B6xuSHsQ.js +1 -0
  1086. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DdXZOFqY.js +1 -0
  1087. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-CJbOM-QK.js +1 -0
  1088. ksadk/studio/static/assets/swimlanes-42K2YHIH-NtgEEHLY.js +1 -0
  1089. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-D-AVlW8B.js +8 -0
  1090. ksadk/studio/static/assets/{timeline-definition-24CTP7MA-DxmSSjRB.js → timeline-definition-24CTP7MA-CIuYhNy3.js} +7 -7
  1091. ksadk/studio/static/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
  1092. ksadk/studio/static/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
  1093. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-7HbApbrv.js +34 -0
  1094. ksadk/studio/static/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
  1095. ksadk/studio/static/assets/{wardleyDiagram-VM6X3IG4-Ba1AOWoe.js → wardleyDiagram-VM6X3IG4-CMJiaedy.js} +1 -1
  1096. ksadk/studio/static/assets/{xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js → xychartDiagram-S5SC5T6Z-BdgtMvW2.js} +6 -6
  1097. ksadk/studio/static/index.html +8 -2
  1098. ksadk/studio/teams_catalog.py +166 -0
  1099. ksadk/studio/teams_installation.py +217 -0
  1100. ksadk/studio/teams_node.py +549 -0
  1101. ksadk/studio/teams_node_factory.py +558 -0
  1102. ksadk/studio/teams_node_runner.py +72 -0
  1103. ksadk/studio/teams_node_v1.py +935 -0
  1104. ksadk/studio/teams_remote.py +496 -0
  1105. ksadk/studio/templates.py +41 -19
  1106. ksadk/studio/validator.py +13 -0
  1107. ksadk/studio/workspace.py +19 -4
  1108. ksadk/studio/workspace_plugins.py +138 -0
  1109. ksadk/studio/workspace_registry.py +286 -0
  1110. ksadk/tools/a2a_policy.py +5 -0
  1111. ksadk/tools/artifact_observation.py +53 -0
  1112. ksadk/tools/captured_source_artifact.py +68 -0
  1113. ksadk/tools/schema.py +34 -0
  1114. ksadk/toolsets/__init__.py +93 -88
  1115. ksadk/toolsets/a2a.py +89 -89
  1116. ksadk/toolsets/sandbox.py +377 -6
  1117. ksadk/toolsets/skill_management.py +315 -0
  1118. ksadk/toolsets/skills.py +446 -378
  1119. ksadk/toolsets/tool_selection.py +94 -0
  1120. ksadk/toolsets/workspace.py +344 -326
  1121. ksadk/toolsets/workspace_editing.py +291 -0
  1122. ksadk/toolsets/workspace_identity.py +15 -0
  1123. ksadk/toolsets/workspace_model_observation.py +104 -0
  1124. ksadk/toolsets/workspace_mutation.py +75 -0
  1125. ksadk/toolsets/workspace_read_budget.py +216 -0
  1126. ksadk/toolsets/workspace_search.py +192 -0
  1127. ksadk/toolsets/workspace_search_process.py +129 -0
  1128. ksadk/toolsets/workspace_state.py +6 -0
  1129. ksadk/version.py +1 -1
  1130. ksadk_runtime_common/http_headers.py +18 -0
  1131. ksadk_runtime_common/memory_backend/providers/lancedb.py +56 -2
  1132. ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -148
  1133. ksadk_runtime_common/workspace_files/router.py +28 -14
  1134. agentengine_sdk_python-0.8.4.dist-info/RECORD +0 -1070
  1135. ksadk/server/static/assets/MathMessageMarkdown-DbdW5A4_.js +0 -8
  1136. ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +0 -1
  1137. ksadk/server/static/assets/channel-CF5Up3hQ.js +0 -1
  1138. ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +0 -1
  1139. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +0 -1
  1140. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +0 -1
  1141. ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +0 -1
  1142. ksadk/server/static/assets/dist-B2_CVgKv.js +0 -1
  1143. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +0 -1
  1144. ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +0 -1
  1145. ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +0 -1
  1146. ksadk/server/static/assets/index-DcTML1Up.css +0 -2
  1147. ksadk/server/static/assets/index-Dh2XHqPK.js +0 -244
  1148. ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +0 -1
  1149. ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +0 -1
  1150. ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +0 -1
  1151. ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +0 -1
  1152. ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +0 -1
  1153. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +0 -1
  1154. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +0 -1
  1155. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +0 -1
  1156. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +0 -1
  1157. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +0 -8
  1158. ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +0 -1
  1159. ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +0 -1
  1160. ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +0 -1
  1161. ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +0 -41
  1162. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +0 -8
  1163. ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +0 -44
  1164. ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +0 -3
  1165. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +0 -1
  1166. ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +0 -1
  1167. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +0 -36
  1168. ksadk/studio/static/assets/channel-BqO-gtEw.js +0 -1
  1169. ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +0 -2
  1170. ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +0 -1
  1171. ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +0 -1
  1172. ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +0 -1
  1173. ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +0 -1
  1174. ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +0 -1
  1175. ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +0 -1
  1176. ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +0 -1
  1177. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +0 -1
  1178. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +0 -1
  1179. ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +0 -1
  1180. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +0 -62
  1181. ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +0 -4
  1182. ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +0 -41
  1183. ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +0 -3
  1184. ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +0 -24
  1185. ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +0 -24
  1186. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +0 -1
  1187. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +0 -1
  1188. ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +0 -1
  1189. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +0 -292
  1190. ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +0 -1
  1191. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +0 -106
  1192. ksadk/studio/static/assets/index-CeHL9ARV.css +0 -2
  1193. ksadk/studio/static/assets/index-D9QEcVpL.js +0 -320
  1194. ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +0 -1
  1195. ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +0 -2
  1196. ksadk/studio/static/assets/linear-BCxN9JLv.js +0 -1
  1197. ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +0 -7
  1198. ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +0 -1
  1199. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +0 -1
  1200. ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +0 -1
  1201. ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +0 -1
  1202. ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +0 -1
  1203. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +0 -1
  1204. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +0 -1
  1205. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +0 -1
  1206. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +0 -1
  1207. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +0 -40
  1208. ksadk/studio/static/assets/src-SFn9St9H.js +0 -1
  1209. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +0 -1
  1210. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +0 -1
  1211. ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +0 -1
  1212. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +0 -8
  1213. ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +0 -1
  1214. ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +0 -1
  1215. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +0 -34
  1216. ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +0 -1
  1217. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
  1218. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
  1219. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
  1220. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
  1221. /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
ksadk/codex/client.py CHANGED
@@ -18,24 +18,17 @@
18
18
 
19
19
  from __future__ import annotations
20
20
 
21
- import asyncio
22
21
  import hashlib
23
22
  import json
24
- import os
25
- import queue
26
23
  import re
27
- import secrets
28
24
  import stat
29
25
  import threading
30
26
  from abc import ABC, abstractmethod
31
27
  from collections.abc import Mapping
32
28
  from dataclasses import dataclass, field
33
- from importlib.metadata import PackageNotFoundError, version
34
29
  from pathlib import Path
35
30
  from typing import Any, AsyncIterator, Optional
36
- from uuid import uuid4
37
31
 
38
- from ksadk.model_proxy import ProxyConfig, ProxyServer
39
32
  from ksadk.model_proxy.cache import CapabilityCache, credential_scope
40
33
  from ksadk.model_proxy.detect import (
41
34
  CODEX_DIRECT_REQUIRED_TOOL_TYPES,
@@ -457,1046 +450,6 @@ def _missing_codex_error() -> RuntimeError:
457
450
  )
458
451
 
459
452
 
460
- class AsyncCodexClient(CodexClient):
461
- """基于 OpenAI 官方 ``openai-codex`` SDK(``AsyncCodex``)的生产后端。
462
-
463
- **lazy import** ``openai_codex``:仅在实际使用时导入,缺依赖时显式报错
464
- (``pip install 'ksadk[codex]'``),不让所有 ksadk 用户默认背几十 MB CLI 二进制。
465
- 构造时校验真实 SDK 方法存在(``thread_start``/``thread_resume``/``close`` 及
466
- ``AsyncThread.turn`` / ``AsyncTurnHandle.stream``/``interrupt``),版本漂移 fail-fast。
467
- """
468
-
469
- def __init__(self, config: Any = None, *, proxy_observer: Any = None) -> None:
470
- try:
471
- from openai_codex import ( # type: ignore[import-not-found]
472
- AsyncCodex,
473
- AsyncThread,
474
- AsyncTurnHandle,
475
- )
476
- except ImportError as exc:
477
- raise _missing_codex_error() from exc
478
-
479
- try:
480
- sdk_version = version("openai-codex")
481
- except PackageNotFoundError:
482
- sdk_version = "unknown"
483
- required = (
484
- (AsyncCodex, "thread_start"),
485
- (AsyncCodex, "thread_resume"),
486
- (AsyncCodex, "close"),
487
- (AsyncThread, "turn"),
488
- (AsyncTurnHandle, "stream"),
489
- (AsyncTurnHandle, "interrupt"),
490
- )
491
- for owner, method_name in required:
492
- if not hasattr(owner, method_name):
493
- raise RuntimeError(
494
- f"openai-codex {sdk_version} SDK 缺少 "
495
- f"{owner.__name__}.{method_name}(版本不兼容)"
496
- )
497
-
498
- # AsyncCodex 0.147.0 only accepts one CodexConfig positional/keyword.
499
- config, self._proxy = self._maybe_apply_proxy(
500
- config,
501
- proxy_observer=proxy_observer,
502
- )
503
- self._codex = AsyncCodex(config=config)
504
- self.sdk_version = sdk_version
505
- self._threads: dict[str, Any] = {} # thread_id -> AsyncThread
506
- self._thread_approval_configs: dict[str, dict[str, Any]] = {}
507
- self._active_handles: dict[str, Any] = {} # thread_id -> 活跃 AsyncTurnHandle
508
- self._goal_states: dict[str, Any] = {}
509
- self._approval_queues: dict[str, queue.Queue[Any]] = {}
510
- self._pending_approvals: dict[str, _PendingApproval] = {}
511
- self._pending_interactions: dict[str, _PendingInteraction] = {}
512
- self._approval_lock = threading.Lock()
513
- self._install_approval_bridge()
514
-
515
- async def bootstrap_plugins(self, config: CodexPluginBootstrap) -> None:
516
- """Install a pinned local marketplace on this client's App Server.
517
-
518
- This intentionally uses the ``AsyncCodex`` object's already-owned
519
- low-level transport. Spawning a second bridge process would install
520
- into a different host lifecycle and would not guarantee that the
521
- thread started below observes the same plugin inventory.
522
- """
523
-
524
- config.verify()
525
- try:
526
- from openai_codex.generated.v2_all import ( # type: ignore[import-not-found]
527
- MarketplaceAddResponse,
528
- PluginInstallResponse,
529
- PluginListResponse,
530
- )
531
- except ImportError as exc: # pragma: no cover - guarded by __init__
532
- raise _missing_codex_error() from exc
533
-
534
- await self._codex._ensure_initialized()
535
- transport = getattr(self._codex, "_client", None)
536
- if transport is None or not callable(getattr(transport, "request", None)):
537
- raise CodexPluginBootstrapError(
538
- f"openai-codex {self.sdk_version} lacks the App Server request transport"
539
- )
540
-
541
- receipt = await transport.request(
542
- "marketplace/add",
543
- {
544
- "source": str(config.root),
545
- "refName": None,
546
- "sparsePaths": None,
547
- },
548
- response_model=MarketplaceAddResponse,
549
- )
550
- if str(receipt.marketplace_name) != config.marketplace_name:
551
- raise CodexPluginBootstrapError(
552
- "Codex App Server added an unexpected marketplace: "
553
- f"expected {config.marketplace_name!r}, got {receipt.marketplace_name!r}"
554
- )
555
- installed_root_value = getattr(receipt.installed_root, "root", receipt.installed_root)
556
- try:
557
- installed_root = Path(str(installed_root_value)).resolve(strict=True)
558
- expected_root = config.root.resolve(strict=True)
559
- except OSError as exc:
560
- raise CodexPluginBootstrapError(
561
- "Codex App Server marketplace receipt names an unavailable root"
562
- ) from exc
563
- if installed_root != expected_root:
564
- raise CodexPluginBootstrapError(
565
- "Codex App Server marketplace receipt does not match the pinned root"
566
- )
567
-
568
- marketplace_manifest = str(config.manifest_path.resolve(strict=True))
569
- for plugin_name in config.plugin_names:
570
- await transport.request(
571
- "plugin/install",
572
- {
573
- "pluginName": plugin_name,
574
- "marketplacePath": marketplace_manifest,
575
- "remoteMarketplaceName": None,
576
- },
577
- response_model=PluginInstallResponse,
578
- )
579
-
580
- inventory = await transport.request(
581
- "plugin/list",
582
- {"forceRefetch": True, "cwds": None, "marketplaceKinds": None},
583
- response_model=PluginListResponse,
584
- )
585
- marketplaces = [
586
- marketplace
587
- for marketplace in inventory.marketplaces
588
- if str(marketplace.name) == config.marketplace_name
589
- ]
590
- if len(marketplaces) != 1:
591
- raise CodexPluginBootstrapError(
592
- "Codex App Server did not report exactly one pinned marketplace"
593
- )
594
- marketplace = marketplaces[0]
595
- reported_path_value = getattr(marketplace.path, "root", marketplace.path)
596
- if reported_path_value is None:
597
- raise CodexPluginBootstrapError(
598
- "Codex App Server reported the pinned marketplace as remote"
599
- )
600
- try:
601
- reported_path = Path(str(reported_path_value)).resolve(strict=True)
602
- except OSError as exc:
603
- raise CodexPluginBootstrapError(
604
- "Codex App Server reported an unavailable marketplace manifest"
605
- ) from exc
606
- if reported_path != Path(marketplace_manifest):
607
- raise CodexPluginBootstrapError(
608
- "Codex App Server inventory does not match the pinned marketplace path"
609
- )
610
- for plugin_name in config.plugin_names:
611
- matches = [plugin for plugin in marketplace.plugins if plugin.name == plugin_name]
612
- if len(matches) != 1 or not matches[0].installed or not matches[0].enabled:
613
- raise CodexPluginBootstrapError(
614
- "Codex App Server did not reconcile pinned plugin as installed and enabled: "
615
- + plugin_name
616
- )
617
-
618
- def _install_approval_bridge(self) -> None:
619
- """Replace the SDK's unconditional accept handler with a HITL bridge.
620
-
621
- ``openai-codex==0.147.0`` exposes approval callbacks only on its sync
622
- JSON-RPC client. The public ``AsyncCodex`` wrapper owns that client, so
623
- this pinned compatibility seam is validated eagerly instead of silently
624
- auto-accepting tool and file changes.
625
- """
626
-
627
- async_client = getattr(self._codex, "_client", None)
628
- sync_client = getattr(async_client, "_sync", None)
629
- if sync_client is None or not hasattr(sync_client, "_approval_handler"):
630
- raise RuntimeError(
631
- f"openai-codex {self.sdk_version} 不支持交互式审批桥接(内部 API 不兼容)"
632
- )
633
- sync_client._approval_handler = self._handle_server_request
634
-
635
- def _active_request_queue(self, raw: dict[str, Any]) -> tuple[str, queue.Queue[Any] | None]:
636
- thread_id = str(raw.get("threadId") or raw.get("thread_id") or "")
637
- if not thread_id:
638
- with self._approval_lock:
639
- candidates = list(self._approval_queues)
640
- if len(candidates) == 1:
641
- thread_id = candidates[0]
642
- with self._approval_lock:
643
- return thread_id, self._approval_queues.get(thread_id)
644
-
645
- def _handle_server_request(
646
- self,
647
- method: str,
648
- params: dict[str, Any] | None,
649
- ) -> dict[str, Any]:
650
- if method in {
651
- "item/commandExecution/requestApproval",
652
- "item/fileChange/requestApproval",
653
- }:
654
- return self._handle_approval_request(method, params)
655
- if method in {"item/tool/requestUserInput", "mcpServer/elicitation/request"}:
656
- return self._handle_user_input_request(method, params)
657
- return {}
658
-
659
- def _handle_approval_request(
660
- self,
661
- method: str,
662
- params: dict[str, Any] | None,
663
- ) -> dict[str, Any]:
664
- raw = dict(params or {})
665
- if method not in {
666
- "item/commandExecution/requestApproval",
667
- "item/fileChange/requestApproval",
668
- }:
669
- return {}
670
- thread_id, approval_queue = self._active_request_queue(raw)
671
- approval_id = str(
672
- raw.get("itemId") or raw.get("item_id") or raw.get("id") or f"approval_{uuid4().hex}"
673
- )
674
- pending = _PendingApproval(
675
- approval_id=approval_id,
676
- thread_id=thread_id,
677
- method=method,
678
- params=raw,
679
- )
680
- with self._approval_lock:
681
- if approval_queue is None:
682
- # Fail closed when a request cannot be associated with an
683
- # active run; never fall back to the SDK's auto-accept default.
684
- return {"decision": "decline"}
685
- self._pending_approvals[approval_id] = pending
686
- # 下发原生 JSON-RPC requestApproval 消息(synthetic id=approval_id):
687
- # canonical mapper 只认原生方法(unsupported_method fail-closed),
688
- # 旧合成 ``item/approval/requested`` 事件会让整个 run 失败。
689
- approval_queue.put(
690
- {
691
- "id": approval_id,
692
- "method": method,
693
- "params": raw,
694
- }
695
- )
696
- pending.resolved.wait()
697
- with self._approval_lock:
698
- self._pending_approvals.pop(approval_id, None)
699
- # 回包也以 JSON-RPC response 形态下发,mapper 才会产出
700
- # InteractionResolved(原 call_id 闭环)并释放 continuation。
701
- response = pending.response or {"decision": "decline"}
702
- if approval_queue is not None:
703
- approval_queue.put(
704
- {
705
- "id": approval_id,
706
- "result": dict(response),
707
- }
708
- )
709
- return pending.response or {"decision": "decline"}
710
-
711
- def _handle_user_input_request(
712
- self,
713
- method: str,
714
- params: dict[str, Any] | None,
715
- ) -> dict[str, Any]:
716
- raw = dict(params or {})
717
- thread_id, request_queue = self._active_request_queue(raw)
718
- policy = getattr(self, "_thread_approval_configs", {}).get(thread_id, {})
719
- metadata = raw.get("_meta") or {}
720
- # Full access authorizes tool execution, never OAuth login or arbitrary
721
- # server forms. Only Codex's native, empty tool-approval form qualifies.
722
- schema = raw.get("requestedSchema") or {}
723
- if (
724
- method == "mcpServer/elicitation/request"
725
- and request_queue is not None
726
- and isinstance(metadata, dict)
727
- and metadata.get("codex_approval_kind") == "mcp_tool_call"
728
- and raw.get("mode") == "form"
729
- and schema == {"type": "object", "properties": {}}
730
- and policy.get("sandbox") == "full-access"
731
- and policy.get("approval_mode") == "deny_all"
732
- ):
733
- return {"action": "accept", "content": {}}
734
- interaction_id = str(
735
- raw.get("itemId")
736
- or raw.get("item_id")
737
- or raw.get("requestId")
738
- or raw.get("request_id")
739
- or raw.get("id")
740
- or f"input_{uuid4().hex}"
741
- )
742
- pending = _PendingInteraction(
743
- interaction_id=interaction_id,
744
- thread_id=thread_id,
745
- method=method,
746
- params=raw,
747
- )
748
- default_response = (
749
- {"action": "cancel"} if method == "mcpServer/elicitation/request" else {"answers": {}}
750
- )
751
- if request_queue is None:
752
- return default_response
753
-
754
- # Preserve the native question contract (including multiple choice and
755
- # custom answers) for the canonical interaction mapper. Legacy A2UI
756
- # forms cannot provide the native continuation/response correlation.
757
- with self._approval_lock:
758
- self._pending_interactions[interaction_id] = pending
759
- request_queue.put({"id": interaction_id, "method": method, "params": raw})
760
- pending.resolved.wait()
761
- with self._approval_lock:
762
- self._pending_interactions.pop(interaction_id, None)
763
- response = pending.response or default_response
764
- request_queue.put({"id": interaction_id, "result": dict(response)})
765
- return response
766
-
767
- @staticmethod
768
- def _maybe_apply_proxy(
769
- config: Any,
770
- *,
771
- proxy_observer: Any = None,
772
- ) -> tuple[Any, Any]:
773
- """codex 代理启用:**智能探测 fallback(带显式覆盖)**。
774
-
775
- - ``KSADK_CODEX_USE_PROXY=1`` → 强制开代理;``=0`` → 强制直连(可人工覆盖误判)。
776
- - **未设 env 时智能探测**:OpenAI 官方 base_url 直连(不探测);自定义上游
777
- (星流等)探测 responses 能力(detect.py + CapabilityCache 缓存,一次探测长缓存):
778
- - namespace/custom 支持 → 原生 Responses 直连
779
- - 仅 web_search 缺失 → 仍直连,并关闭该可选能力
780
- - namespace/custom 缺失或无法确认 → 自动启用代理
781
- - 凭证闭合:codex 子进程只拿随机 KSADK_PROXY_TOKEN;上游 key 留父进程。
782
- - 互斥:launch_args_override 已设时 raise(override 整体覆盖命令行)。
783
- - P1:直连分支(协议必需工具面确认、env=0)遇到自定义 base 也注入
784
- ``ksadk_direct`` provider——否则 codex 子进程回落默认 OpenAI 官方
785
- 端点,自定义上游(OPENAI_API_BASE)静默失效。已显式设
786
- ``model_provider=`` 的 config 不覆盖;官方 base 不注入。
787
-
788
- 返回 (新 config, ProxyServer | None)。staticmethod 便于单测。
789
- """
790
- runtime_env = {**os.environ, **(getattr(config, "env", None) or {})}
791
- env_val = runtime_env.get("KSADK_CODEX_USE_PROXY")
792
- if env_val in {"0", "direct"}:
793
- return AsyncCodexClient._inject_direct_provider(config), None
794
- if env_val in {"1", "forced"}:
795
- return AsyncCodexClient._start_proxy_and_inject(
796
- config,
797
- proxy_observer=proxy_observer,
798
- )
799
- # 未设:智能探测
800
- base = (
801
- runtime_env.get("KSADK_PROXY_UPSTREAM_BASE")
802
- or runtime_env.get("OPENAI_BASE_URL")
803
- or runtime_env.get("OPENAI_API_BASE")
804
- or ""
805
- )
806
- if not base or _is_openai_official(base):
807
- return config, None # OpenAI 官方:直连,不探测
808
- model = runtime_env.get("OPENAI_MODEL_NAME") or runtime_env.get("MODEL_NAME") or ""
809
- key = runtime_env.get("KSADK_PROXY_UPSTREAM_KEY") or runtime_env.get("OPENAI_API_KEY") or ""
810
- # Probe the exact URL scheme that Codex/proxy will use. Managed
811
- # runtimes discover KSPMAS through its historical ``http://`` internal
812
- # URL, while the provider is upgraded to HTTPS before execution. A
813
- # probe against HTTP can see only a redirect and incorrectly classify
814
- # an HTTPS ``/responses`` 404 as unknown, causing a broken direct path.
815
- probe_base = _upgrade_http_to_https(base)
816
- route = _probe_capability_route(model, probe_base, key)
817
- # Future required-tool declarations must be checked here before either
818
- # proxying or suppressing optional tools.
819
- if isinstance(route, bool): # compatibility for injected test doubles
820
- route = _CapabilityRoute(use_proxy=route)
821
- route.require_available()
822
- if route.use_proxy:
823
- return AsyncCodexClient._start_proxy_and_inject(
824
- config,
825
- proxy_observer=proxy_observer,
826
- )
827
- # 探测确认协议必需工具面:直连,但必须把自定义 base 配成 provider。
828
- return (
829
- AsyncCodexClient._inject_direct_provider(
830
- config,
831
- disabled_tool_types=route.disabled_tool_types,
832
- ),
833
- None,
834
- )
835
-
836
- @staticmethod
837
- def _inject_direct_provider(
838
- config: Any,
839
- *,
840
- disabled_tool_types: frozenset[str] = frozenset(),
841
- ) -> Any:
842
- """直连模式注入 ``ksadk_direct`` provider(P1:非 proxy 不丢自定义 base)。
843
-
844
- - 无自定义 base / 官方 OpenAI base → 原样返回。
845
- - 已设 ``model_provider=`` → 保留 provider,仅追加必要的可选工具关闭项。
846
- - 否则追加 ``model_provider=ksadk_direct`` + base_url/env_key/wire_api
847
- (responses;该分支只在探测确认或显式强制直连时到达,其余走 proxy)。
848
- """
849
- import dataclasses
850
-
851
- from openai_codex import CodexConfig # type: ignore[import-not-found]
852
-
853
- cfg = config if isinstance(config, CodexConfig) else CodexConfig()
854
- overrides = list(cfg.config_overrides or ())
855
- if any(str(o).startswith("model_provider=") for o in overrides):
856
- if "web_search" in disabled_tool_types and "web_search=disabled" not in overrides:
857
- return dataclasses.replace(
858
- cfg,
859
- config_overrides=tuple([*overrides, "web_search=disabled"]),
860
- )
861
- return config
862
- runtime_env = {**os.environ, **(cfg.env or {})}
863
- base = (
864
- runtime_env.get("KSADK_PROXY_UPSTREAM_BASE")
865
- or runtime_env.get("OPENAI_BASE_URL")
866
- or runtime_env.get("OPENAI_API_BASE")
867
- or ""
868
- )
869
- if not base or _is_openai_official(base):
870
- return config
871
- base = _upgrade_http_to_https(base)
872
- overrides += [
873
- "model_provider=ksadk_direct",
874
- "model_providers.ksadk_direct.name=ksadk_direct",
875
- f"model_providers.ksadk_direct.base_url={base}",
876
- "model_providers.ksadk_direct.env_key=OPENAI_API_KEY",
877
- "model_providers.ksadk_direct.wire_api=responses",
878
- "model_providers.ksadk_direct.supports_websockets=false",
879
- ]
880
- if "web_search" in disabled_tool_types and "web_search=disabled" not in overrides:
881
- overrides.append("web_search=disabled")
882
- return dataclasses.replace(cfg, config_overrides=tuple(overrides))
883
-
884
- @staticmethod
885
- def _start_proxy_and_inject(
886
- config: Any,
887
- *,
888
- proxy_observer: Any = None,
889
- ) -> tuple[Any, Any]:
890
- """起进程内 ProxyServer + 注入 codex provider(opt-in/探测判定走代理时)。"""
891
- import dataclasses
892
-
893
- from openai_codex import CodexConfig # type: ignore[import-not-found]
894
-
895
- cfg = config if isinstance(config, CodexConfig) else CodexConfig()
896
- if cfg.launch_args_override is not None:
897
- raise RuntimeError(
898
- "KSADK_CODEX_USE_PROXY 与 CodexConfig.launch_args_override 互斥:"
899
- "代理注入靠 config_overrides,而 launch_args_override 会整体覆盖命令行"
900
- )
901
- runtime_env = {**os.environ, **(cfg.env or {})}
902
- upstream = (
903
- runtime_env.get("KSADK_PROXY_UPSTREAM_BASE")
904
- or runtime_env.get("OPENAI_BASE_URL")
905
- or runtime_env.get("OPENAI_API_BASE")
906
- or "https://kspmas.ksyun.com/v1"
907
- )
908
- upstream = _upgrade_http_to_https(upstream)
909
- api_key = (
910
- runtime_env.get("KSADK_PROXY_UPSTREAM_KEY") or runtime_env.get("OPENAI_API_KEY") or ""
911
- )
912
- token = secrets.token_hex(16)
913
- proxy = ProxyServer(
914
- ProxyConfig(
915
- upstream_base=upstream,
916
- api_key=api_key,
917
- local_token=token,
918
- upstream_model=runtime_env.get("OPENAI_MODEL_NAME")
919
- or runtime_env.get("MODEL_NAME")
920
- or "",
921
- event_callback=proxy_observer,
922
- )
923
- )
924
- proxy.start()
925
- overrides = list(cfg.config_overrides or ())
926
- # 默认模型必须注入:codex 未配置 model= 时会发自家默认名(如 gpt-5.6-terra),
927
- # 上游(kspmas)按未知模型 403。注入后 thread 级 model 覆盖仍优先生效
928
- # (实测 codex thread model > config model=),RunAgent 的 Model 透传靠它。
929
- default_model = (
930
- runtime_env.get("OPENAI_MODEL_NAME") or runtime_env.get("MODEL_NAME") or ""
931
- ).strip()
932
- if default_model and not any(str(o).startswith("model=") for o in overrides):
933
- overrides.append(f"model={default_model}")
934
- overrides += [
935
- "model_provider=ksadk_proxy",
936
- "model_providers.ksadk_proxy.name=ksadk_proxy",
937
- f"model_providers.ksadk_proxy.base_url={proxy.base_url}",
938
- "model_providers.ksadk_proxy.env_key=KSADK_PROXY_TOKEN",
939
- "model_providers.ksadk_proxy.wire_api=responses",
940
- "model_providers.ksadk_proxy.supports_websockets=false",
941
- "web_search=disabled",
942
- "features.multi_agent=false",
943
- "features.multi_agent_v2=false",
944
- ]
945
- # The local proxy owns the upstream credential. The Codex child only
946
- # receives a random loopback token, so prompt-driven commands cannot
947
- # read the real provider key from their environment.
948
- env = dict(runtime_env)
949
- for secret_name in (
950
- "OPENAI_API_KEY",
951
- "AGENTKIT_MODEL_API_KEY",
952
- "KSADK_PROXY_UPSTREAM_KEY",
953
- ):
954
- env.pop(secret_name, None)
955
- env["KSADK_PROXY_TOKEN"] = token
956
- return dataclasses.replace(cfg, config_overrides=tuple(overrides), env=env), proxy
957
-
958
- async def start_thread(self, config: Optional[dict[str, Any]] = None) -> str:
959
- if self._uses_manual_approval(config):
960
- thread = await self._start_manual_thread(config)
961
- else:
962
- thread = await self._codex.thread_start(**self._thread_kwargs(config))
963
- self._threads[thread.id] = thread
964
- return str(thread.id)
965
-
966
- async def compact_thread(self, thread_id: str) -> dict[str, Any]:
967
- """Wait for native compaction completion, not just request admission.
968
-
969
- The caller owns an idle, dedicated client and closes it on timeout.
970
- No model prompt or shell command is used to emulate compaction.
971
- """
972
- thread = self._threads[thread_id]
973
- low_level = self._codex._client
974
- turn_id = None
975
- compacted = False
976
- usage: dict[str, Any] = {}
977
- try:
978
- async with asyncio.timeout(120):
979
- before = await thread.read(include_turns=True)
980
- previous_ids = {turn.id for turn in before.thread.turns}
981
- await thread.compact()
982
- # compact/start returns no turn id. The SDK buffers scoped
983
- # notifications until their turn is registered; global reads
984
- # deliberately exclude them. Discover the new turn first.
985
- while turn_id is None:
986
- current = await thread.read(include_turns=True)
987
- new_turns = [
988
- turn for turn in current.thread.turns if turn.id not in previous_ids
989
- ]
990
- if new_turns:
991
- turn_id = new_turns[-1].id
992
- low_level.register_turn_notifications(turn_id)
993
- break
994
- await asyncio.sleep(0.25)
995
- while True:
996
- notification = await low_level.next_turn_notification(turn_id)
997
- event = self._notification_to_event_dict(notification) or {}
998
- params = event.get("params") or {}
999
- if params.get("threadId") != thread_id:
1000
- continue
1001
- method = event.get("method")
1002
- if method == "item/completed":
1003
- compacted |= (params.get("item") or {}).get("type") == "contextCompaction"
1004
- elif method == "thread/tokenUsage/updated":
1005
- usage = dict(params.get("tokenUsage") or {})
1006
- elif method == "turn/completed":
1007
- turn = params["turn"]
1008
- if turn.get("status") != "completed" or not compacted:
1009
- raise RuntimeError("Codex context compaction did not complete")
1010
- return usage
1011
- finally:
1012
- if turn_id is not None:
1013
- low_level.unregister_turn_notifications(turn_id)
1014
-
1015
- async def resume_thread(self, thread_id: str, config: Optional[dict[str, Any]] = None) -> str:
1016
- # An ephemeral thread has no rollout on disk, so SDK thread_resume would
1017
- # fail with -32600. Reuse its live AsyncThread for same-process resume.
1018
- cached = self._threads.get(thread_id)
1019
- if cached is not None:
1020
- return str(cached.id)
1021
- if self._uses_manual_approval(config):
1022
- thread = await self._resume_manual_thread(thread_id, config)
1023
- else:
1024
- kwargs = self._thread_kwargs(config)
1025
- # AsyncCodex.thread_resume 0.144.4 has no ephemeral parameter.
1026
- kwargs.pop("ephemeral", None)
1027
- thread = await self._codex.thread_resume(thread_id, **kwargs)
1028
- self._threads[thread.id] = thread
1029
- return str(thread.id)
1030
-
1031
- @staticmethod
1032
- def _uses_manual_approval(config: Optional[dict[str, Any]]) -> bool:
1033
- return str((config or {}).get("approval_mode") or "").strip().lower() == "manual"
1034
-
1035
- async def _start_manual_thread(self, config: Optional[dict[str, Any]]) -> Any:
1036
- """Start a thread whose native approvals are reviewed by Studio users.
1037
-
1038
- ``openai-codex==0.147.0`` exposes ``ApprovalsReviewer.user`` on the
1039
- generated app-server contract but omits it from the public
1040
- ``ApprovalMode`` enum. Use that pinned wire contract explicitly rather
1041
- than falling back to ``auto_review``.
1042
- """
1043
-
1044
- from openai_codex import AsyncThread # type: ignore[import-not-found]
1045
- from openai_codex._sandbox import _sandbox_mode # type: ignore[import-not-found]
1046
- from openai_codex.generated.v2_all import ( # type: ignore[import-not-found]
1047
- ApprovalsReviewer,
1048
- AskForApproval,
1049
- AskForApprovalValue,
1050
- ThreadStartParams,
1051
- )
1052
-
1053
- kwargs = self._thread_kwargs(self._without_manual_approval(config))
1054
- kwargs.pop("approval_mode", None)
1055
- sandbox = kwargs.pop("sandbox", None)
1056
- await self._codex._ensure_initialized()
1057
- started = await self._codex._client.thread_start(
1058
- ThreadStartParams(
1059
- approval_policy=AskForApproval(root=AskForApprovalValue.on_request),
1060
- approvals_reviewer=ApprovalsReviewer.user,
1061
- sandbox=_sandbox_mode(sandbox),
1062
- **kwargs,
1063
- )
1064
- )
1065
- return AsyncThread(self._codex, started.thread.id)
1066
-
1067
- async def _resume_manual_thread(
1068
- self,
1069
- thread_id: str,
1070
- config: Optional[dict[str, Any]],
1071
- ) -> Any:
1072
- from openai_codex import AsyncThread # type: ignore[import-not-found]
1073
- from openai_codex._sandbox import _sandbox_mode # type: ignore[import-not-found]
1074
- from openai_codex.generated.v2_all import ( # type: ignore[import-not-found]
1075
- ApprovalsReviewer,
1076
- AskForApproval,
1077
- AskForApprovalValue,
1078
- ThreadResumeParams,
1079
- )
1080
-
1081
- kwargs = self._thread_kwargs(self._without_manual_approval(config))
1082
- kwargs.pop("approval_mode", None)
1083
- kwargs.pop("ephemeral", None)
1084
- sandbox = kwargs.pop("sandbox", None)
1085
- await self._codex._ensure_initialized()
1086
- resumed = await self._codex._client.thread_resume(
1087
- thread_id,
1088
- ThreadResumeParams(
1089
- thread_id=thread_id,
1090
- approval_policy=AskForApproval(root=AskForApprovalValue.on_request),
1091
- approvals_reviewer=ApprovalsReviewer.user,
1092
- sandbox=_sandbox_mode(sandbox),
1093
- **kwargs,
1094
- ),
1095
- )
1096
- return AsyncThread(self._codex, resumed.thread.id)
1097
-
1098
- @staticmethod
1099
- def _without_manual_approval(
1100
- config: Optional[dict[str, Any]],
1101
- ) -> dict[str, Any]:
1102
- result = dict(config or {})
1103
- result.pop("approval_mode", None)
1104
- return result
1105
-
1106
- def run_turn(
1107
- self,
1108
- thread_id: str,
1109
- prompt: Any,
1110
- *,
1111
- config: Optional[dict[str, Any]] = None,
1112
- ) -> AsyncIterator[dict[str, Any]]:
1113
- return self._run_turn_gen(thread_id, prompt, config)
1114
-
1115
- def run_goal(
1116
- self,
1117
- thread_id: str,
1118
- objective: str,
1119
- *,
1120
- config: Optional[dict[str, Any]] = None,
1121
- ) -> AsyncIterator[dict[str, Any]]:
1122
- return self._run_goal_gen(thread_id, objective, config)
1123
-
1124
- async def _run_turn_gen(
1125
- self, thread_id: str, prompt: Any, config: Optional[dict[str, Any]]
1126
- ) -> AsyncIterator[dict[str, Any]]:
1127
- thread = self._threads.get(thread_id)
1128
- if thread is None:
1129
- # 未显式 start/resume 的 thread_id:按 resume 语义接入真实后端。
1130
- await self.resume_thread(thread_id, config)
1131
- thread = self._threads[thread_id]
1132
- approval_queue: queue.Queue[Any] = queue.Queue()
1133
- with self._approval_lock:
1134
- self._approval_queues[thread_id] = approval_queue
1135
- self._thread_approval_configs[thread_id] = dict(config or {})
1136
- handle = await self._start_turn(thread, self._coerce_input(prompt), config)
1137
- self._active_handles[thread_id] = handle
1138
- notifications = handle.stream()
1139
- notification_task: Any = None
1140
- approval_task: Any = None
1141
- try:
1142
- while True:
1143
- if notification_task is None:
1144
- notification_task = asyncio.create_task(notifications.__anext__())
1145
- if approval_task is None:
1146
- approval_task = asyncio.create_task(asyncio.to_thread(approval_queue.get))
1147
- done, _pending = await asyncio.wait(
1148
- {notification_task, approval_task},
1149
- return_when=asyncio.FIRST_COMPLETED,
1150
- )
1151
- if approval_task in done:
1152
- approval_event = approval_task.result()
1153
- approval_task = None
1154
- if approval_event is not None:
1155
- yield approval_event
1156
- if notification_task in done:
1157
- try:
1158
- notification = notification_task.result()
1159
- except StopAsyncIteration:
1160
- break
1161
- notification_task = None
1162
- event = self._notification_to_event_dict(notification)
1163
- if event is not None:
1164
- yield event
1165
- finally:
1166
- approval_queue.put(None)
1167
- for task in (notification_task, approval_task):
1168
- if task is not None and not task.done():
1169
- task.cancel()
1170
- await asyncio.gather(
1171
- *(task for task in (notification_task, approval_task) if task is not None),
1172
- return_exceptions=True,
1173
- )
1174
- self._active_handles.pop(thread_id, None)
1175
- with self._approval_lock:
1176
- self._approval_queues.pop(thread_id, None)
1177
-
1178
- async def _run_goal_gen(
1179
- self,
1180
- thread_id: str,
1181
- objective: str,
1182
- config: Optional[dict[str, Any]],
1183
- ) -> AsyncIterator[dict[str, Any]]:
1184
- if thread_id not in self._threads:
1185
- await self.resume_thread(thread_id, config)
1186
- from openai_codex._goal import _AsyncGoalNotificationStream
1187
-
1188
- low_level = self._codex._client
1189
- approval_queue: queue.Queue[Any] = queue.Queue()
1190
- with self._approval_lock:
1191
- self._approval_queues[thread_id] = approval_queue
1192
- self._thread_approval_configs[thread_id] = dict(config or {})
1193
- state, _logical_turn_id = await low_level.start_goal_operation(thread_id, objective)
1194
- self._goal_states[thread_id] = state
1195
- notifications = _AsyncGoalNotificationStream(
1196
- state=state,
1197
- next_notification=lambda: low_level.next_goal_notification(state),
1198
- unregister=lambda: low_level.unregister_goal_operation(state),
1199
- cancel_goal=lambda: low_level.cancel_goal_operation(state),
1200
- )
1201
- notification_task: Any = None
1202
- approval_task: Any = None
1203
- try:
1204
- while True:
1205
- if notification_task is None:
1206
- notification_task = asyncio.create_task(notifications.__anext__())
1207
- if approval_task is None:
1208
- approval_task = asyncio.create_task(asyncio.to_thread(approval_queue.get))
1209
- done, _pending = await asyncio.wait(
1210
- {notification_task, approval_task},
1211
- return_when=asyncio.FIRST_COMPLETED,
1212
- )
1213
- if approval_task in done:
1214
- approval_event = approval_task.result()
1215
- approval_task = None
1216
- if approval_event is not None:
1217
- yield approval_event
1218
- if notification_task in done:
1219
- try:
1220
- notification = notification_task.result()
1221
- except StopAsyncIteration:
1222
- break
1223
- notification_task = None
1224
- event = self._notification_to_event_dict(notification)
1225
- if event is not None:
1226
- yield event
1227
- finally:
1228
- approval_queue.put(None)
1229
- for task in (notification_task, approval_task):
1230
- if task is not None and not task.done():
1231
- task.cancel()
1232
- await asyncio.gather(
1233
- *(task for task in (notification_task, approval_task) if task is not None),
1234
- return_exceptions=True,
1235
- )
1236
- await notifications.aclose()
1237
- self._goal_states.pop(thread_id, None)
1238
- with self._approval_lock:
1239
- self._approval_queues.pop(thread_id, None)
1240
-
1241
- async def _start_turn(
1242
- self,
1243
- thread: Any,
1244
- prompt: Any,
1245
- config: Optional[dict[str, Any]],
1246
- ) -> Any:
1247
- mode = str((config or {}).get("collaboration_mode") or "").strip().lower()
1248
- if not mode or mode == "default":
1249
- return await thread.turn(prompt, **self._turn_kwargs(config))
1250
- if mode != "plan":
1251
- raise ValueError("collaboration_mode must be default or plan")
1252
-
1253
- # openai-codex 0.144.4 predates the public collaboration_mode argument,
1254
- # while the bundled app-server already accepts it. Keep this private
1255
- # compatibility seam small and covered by a wire-payload test.
1256
- from openai_codex import AsyncTurnHandle
1257
- from openai_codex._approval_mode import _approval_mode_override_settings
1258
- from openai_codex._inputs import _normalize_run_input, _to_wire_input
1259
- from openai_codex._sandbox import _sandbox_policy
1260
- from openai_codex.generated.v2_all import TurnStartParams
1261
-
1262
- turn_config = self._turn_kwargs(config)
1263
- approval_mode = turn_config.pop("approval_mode", None)
1264
- sandbox = turn_config.pop("sandbox", None)
1265
- approval_policy, approvals_reviewer = _approval_mode_override_settings(approval_mode)
1266
- wire_input = _to_wire_input(_normalize_run_input(prompt))
1267
- params = TurnStartParams(
1268
- thread_id=thread.id,
1269
- input=wire_input,
1270
- approval_policy=approval_policy,
1271
- approvals_reviewer=approvals_reviewer,
1272
- sandbox_policy=_sandbox_policy(sandbox),
1273
- **turn_config,
1274
- ).model_dump(mode="json", by_alias=True, exclude_none=True)
1275
- params["collaborationMode"] = {
1276
- "mode": "plan",
1277
- "settings": {
1278
- "model": str((config or {}).get("model") or ""),
1279
- "reasoning_effort": None,
1280
- "developer_instructions": None,
1281
- },
1282
- }
1283
- started = await self._codex._client.turn_start(thread.id, wire_input, params=params)
1284
- return AsyncTurnHandle(self._codex, thread.id, started.turn.id)
1285
-
1286
- async def interrupt_active_turn(self, thread_id: str) -> bool:
1287
- handle = self._active_handles.get(thread_id)
1288
- if handle is None:
1289
- return False
1290
- await handle.interrupt()
1291
- return True
1292
-
1293
- async def pause_goal(self, thread_id: str) -> bool:
1294
- state = self._goal_states.get(thread_id)
1295
- if state is None:
1296
- return False
1297
- await self._codex._client.pause_goal(thread_id)
1298
- return True
1299
-
1300
- async def cancel_goal(self, thread_id: str) -> bool:
1301
- state = self._goal_states.get(thread_id)
1302
- if state is None:
1303
- return False
1304
- await self._codex._client.cancel_goal_operation(state)
1305
- return True
1306
-
1307
- async def resolve_approval(self, approval_id: str, decision: str) -> bool:
1308
- normalized = {
1309
- "approve": "accept",
1310
- "accept": "accept",
1311
- "approve_session": "acceptForSession",
1312
- "accept_for_session": "acceptForSession",
1313
- "deny": "decline",
1314
- "decline": "decline",
1315
- "cancel": "cancel",
1316
- }.get(str(decision).strip().lower())
1317
- if normalized is None:
1318
- raise ValueError("approval decision must be approve, approve_session, deny, or cancel")
1319
- with self._approval_lock:
1320
- pending = self._pending_approvals.get(approval_id)
1321
- if pending is None:
1322
- return False
1323
- pending.response = {"decision": normalized}
1324
- pending.resolved.set()
1325
- return True
1326
-
1327
- async def resolve_interaction(
1328
- self,
1329
- interaction_id: str,
1330
- data: dict[str, Any],
1331
- ) -> bool:
1332
- answers: dict[str, dict[str, list[str]]] = {}
1333
- for key, value in data.items():
1334
- if key in {"decision", "name", "action"} or value is None:
1335
- continue
1336
- raw_answers = value if isinstance(value, list) else [value]
1337
- normalized = [str(answer) for answer in raw_answers if str(answer)]
1338
- answers[str(key)] = {"answers": normalized}
1339
- with self._approval_lock:
1340
- pending = self._pending_interactions.get(interaction_id)
1341
- if pending is None:
1342
- return False
1343
- if pending.method == "mcpServer/elicitation/request":
1344
- action = data.get("action") or {
1345
- "cancel": "cancel",
1346
- "skip": "decline",
1347
- "reject": "decline",
1348
- "deny": "decline",
1349
- "decline": "decline",
1350
- }.get(str(data.get("decision") or ""), "accept")
1351
- if action not in {"accept", "decline", "cancel"}:
1352
- raise ValueError("MCP elicitation action must be accept, decline, or cancel")
1353
- pending.response = {"action": action}
1354
- if action == "accept":
1355
- pending.response["content"] = {
1356
- key: value
1357
- for key, value in data.items()
1358
- if key not in {"action", "decision"}
1359
- }
1360
- else:
1361
- pending.response = {"answers": answers}
1362
- pending.resolved.set()
1363
- return True
1364
-
1365
- async def close(self) -> None:
1366
- approval_lock = getattr(self, "_approval_lock", None)
1367
- if approval_lock is None:
1368
- pending: list[_PendingApproval] = []
1369
- else:
1370
- with approval_lock:
1371
- pending = list(getattr(self, "_pending_approvals", {}).values())
1372
- for approval in pending:
1373
- approval.response = {"decision": "cancel"}
1374
- approval.resolved.set()
1375
- if approval_lock is None:
1376
- interactions: list[_PendingInteraction] = []
1377
- else:
1378
- with approval_lock:
1379
- interactions = list(getattr(self, "_pending_interactions", {}).values())
1380
- for interaction in interactions:
1381
- interaction.response = (
1382
- {"action": "cancel"}
1383
- if interaction.method == "mcpServer/elicitation/request"
1384
- else {"answers": {}}
1385
- )
1386
- interaction.resolved.set()
1387
- for thread_id, state in list(getattr(self, "_goal_states", {}).items()):
1388
- try:
1389
- await self._codex._client.cancel_goal_operation(state)
1390
- except Exception:
1391
- pass
1392
- finally:
1393
- self._goal_states.pop(thread_id, None)
1394
- try:
1395
- await self._codex.close()
1396
- finally:
1397
- self._active_handles.clear()
1398
- self._threads.clear()
1399
- if self._proxy is not None:
1400
- self._proxy.stop()
1401
- self._proxy = None
1402
-
1403
- # ---- 内部:config / input / 事件映射 ----
1404
-
1405
- @staticmethod
1406
- def _thread_kwargs(config: Optional[dict[str, Any]]) -> dict[str, Any]:
1407
- """Map runtime config to the exact 0.144.4 thread API surface."""
1408
- from openai_codex import ApprovalMode, Sandbox # type: ignore[import-not-found]
1409
-
1410
- config = config or {}
1411
- known = {
1412
- "approval_mode",
1413
- "model",
1414
- "model_provider",
1415
- "cwd",
1416
- "sandbox",
1417
- "service_tier",
1418
- "base_instructions",
1419
- "developer_instructions",
1420
- "ephemeral",
1421
- }
1422
- result = {k: v for k, v in config.items() if k in known}
1423
- # KSADK sessions are ephemeral so an interrupted/half-written turn cannot
1424
- # later be revived from Codex's on-disk session store.
1425
- result.setdefault("ephemeral", True)
1426
- if config.get("sandbox_read_only", False):
1427
- result["sandbox"] = Sandbox.read_only
1428
- result.setdefault("approval_mode", ApprovalMode.deny_all)
1429
- else:
1430
- result["sandbox"] = _coerce_enum(Sandbox, result.get("sandbox"))
1431
- result["approval_mode"] = _coerce_enum(ApprovalMode, result.get("approval_mode"))
1432
- return {key: value for key, value in result.items() if value is not None}
1433
-
1434
- @staticmethod
1435
- def _turn_kwargs(config: Optional[dict[str, Any]]) -> dict[str, Any]:
1436
- """Map runtime config to the exact 0.144.4 AsyncThread.turn surface."""
1437
- from openai_codex import ApprovalMode, Sandbox # type: ignore[import-not-found]
1438
-
1439
- config = config or {}
1440
- known = {
1441
- "approval_mode",
1442
- "cwd",
1443
- "effort",
1444
- "model",
1445
- "output_schema",
1446
- "personality",
1447
- "sandbox",
1448
- "service_tier",
1449
- "summary",
1450
- }
1451
- result = {key: value for key, value in config.items() if key in known}
1452
- if config.get("sandbox_read_only", False):
1453
- result["sandbox"] = Sandbox.read_only
1454
- result.setdefault("approval_mode", ApprovalMode.deny_all)
1455
- else:
1456
- result["sandbox"] = _coerce_enum(Sandbox, result.get("sandbox"))
1457
- result["approval_mode"] = _coerce_enum(ApprovalMode, result.get("approval_mode"))
1458
- return {key: value for key, value in result.items() if value is not None}
1459
-
1460
- @staticmethod
1461
- def _coerce_input(prompt: Any) -> Any:
1462
- # RunInput 接受 str 或 [TextInput|...];str 直接透传。
1463
- return prompt if isinstance(prompt, str) else prompt
1464
-
1465
- @staticmethod
1466
- def _notification_to_event_dict(notification: Any) -> Optional[dict[str, Any]]:
1467
- """把真实 ``Notification``(method + 类型化 payload)映射为运行时消费的规范化 dict。
1468
-
1469
- 按 payload 类型路由(结构已对生成的 payload 类型实证);字段级 phase 细节在接
1470
- 真实后端时对齐。
1471
- """
1472
- payload = notification.payload
1473
- if hasattr(payload, "model_dump"):
1474
- params = payload.model_dump(mode="json", by_alias=True)
1475
- else:
1476
- params = getattr(payload, "params", None)
1477
- if not isinstance(params, dict):
1478
- params = {}
1479
-
1480
- method = str(getattr(notification, "method", ""))
1481
- supported_methods = {
1482
- "item/started",
1483
- "item/completed",
1484
- "item/agentMessage/delta",
1485
- "item/autoApprovalReview/started",
1486
- "item/autoApprovalReview/completed",
1487
- "thread/tokenUsage/updated",
1488
- "turn/started",
1489
- "turn/completed",
1490
- "error",
1491
- "item/reasoning/summaryTextDelta",
1492
- "item/reasoning/textDelta",
1493
- "item/reasoning/summaryPartAdded",
1494
- "thread/goal/updated",
1495
- "thread/goal/cleared",
1496
- }
1497
- if method in supported_methods:
1498
- return {"method": method, "params": params}
1499
- return None
1500
453
 
1501
454
 
1502
455
  def _coerce_enum(enum_type: Any, value: Any) -> Any:
@@ -1518,3 +471,6 @@ __all__ = [
1518
471
  "CodexPluginBootstrapError",
1519
472
  "codex_marketplace_tree_digest",
1520
473
  ]
474
+
475
+
476
+ from ksadk.codex.async_client import AsyncCodexClient # noqa: E402