agentengine-sdk-python 0.8.4__py3-none-any.whl → 0.8.5__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 (673) hide show
  1. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/METADATA +6 -3
  2. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/RECORD +591 -365
  3. ksadk/_build_provenance.json +1 -1
  4. ksadk/_process.py +83 -0
  5. ksadk/_str_enum.py +17 -0
  6. ksadk/a2ui/core.py +3 -3
  7. ksadk/api/client.py +6 -0
  8. ksadk/builders/code_builder.py +38 -12
  9. ksadk/builders/framework_requirements.py +20 -2
  10. ksadk/cli/__init__.py +36 -0
  11. ksadk/cli/cmd_config.py +4 -4
  12. ksadk/cli/cmd_create.py +12 -12
  13. ksadk/cli/cmd_hermes.py +24 -2
  14. ksadk/cli/cmd_invoke.py +28 -5
  15. ksadk/cli/cmd_openclaw.py +26 -1
  16. ksadk/cli/cmd_plugin.py +70 -12
  17. ksadk/cli/cmd_studio.py +64 -16
  18. ksadk/cli/openclaw_env.py +1 -1
  19. ksadk/cli/resource_common.py +26 -0
  20. ksadk/codex/client.py +3 -2
  21. ksadk/configs/__init__.py +1 -1
  22. ksadk/configs/env_registry.py +125 -31
  23. ksadk/configs/env_registry_studio.py +86 -0
  24. ksadk/configs/global_config.py +1 -1
  25. ksadk/configs/settings.py +3 -3
  26. ksadk/connector/__init__.py +17 -0
  27. ksadk/connector/channel.py +477 -0
  28. ksadk/context_engine/capabilities.py +52 -4
  29. ksadk/conversations/attachment_storage.py +10 -3
  30. ksadk/conversations/attachments.py +16 -5
  31. ksadk/conversations/message_projection.py +23 -32
  32. ksadk/conversations/normalize.py +28 -10
  33. ksadk/conversations/runtime_baseline.py +37 -0
  34. ksadk/conversations/runtime_invocation.py +17 -4
  35. ksadk/conversations/runtime_observability.py +39 -10
  36. ksadk/conversations/runtime_payloads.py +8 -0
  37. ksadk/conversations/runtime_persistence.py +105 -9
  38. ksadk/conversations/runtime_preparation.py +13 -7
  39. ksadk/conversations/runtime_stream_events.py +29 -35
  40. ksadk/conversations/runtime_streaming.py +8 -0
  41. ksadk/events/adapters/_codex_items.py +16 -8
  42. ksadk/events/adapters/_langgraph_support.py +34 -0
  43. ksadk/events/session_event.py +2 -2
  44. ksadk/harness/__init__.py +14 -0
  45. ksadk/harness/app.py +11 -0
  46. ksadk/harness/artifact_store.py +213 -0
  47. ksadk/harness/capabilities.py +115 -0
  48. ksadk/harness/capability_runtime.py +237 -0
  49. ksadk/harness/closure_contract.py +92 -0
  50. ksadk/harness/compaction_record.py +122 -0
  51. ksadk/harness/compiler.py +284 -0
  52. ksadk/harness/conformance/__init__.py +33 -0
  53. ksadk/harness/conformance/contract.py +506 -0
  54. ksadk/harness/conformance/fixtures.py +102 -0
  55. ksadk/harness/context_engine.py +403 -0
  56. ksadk/harness/context_maintenance.py +259 -0
  57. ksadk/harness/context_manifest.py +188 -0
  58. ksadk/harness/context_tuning.py +168 -0
  59. ksadk/harness/draft_runtime.py +322 -0
  60. ksadk/harness/engine/__init__.py +40 -0
  61. ksadk/harness/engine/base.py +122 -0
  62. ksadk/harness/engine/budgets.py +108 -0
  63. ksadk/harness/engine/capability_declarations.py +59 -0
  64. ksadk/harness/engine/completion_guard.py +42 -0
  65. ksadk/harness/engine/context_pipeline.py +579 -0
  66. ksadk/harness/engine/graph_builder.py +859 -0
  67. ksadk/harness/engine/langgraph.py +931 -0
  68. ksadk/harness/engine/mcp_disclosure.py +750 -0
  69. ksadk/harness/engine/policy_runtime.py +70 -0
  70. ksadk/harness/engine/postgres_checkpointer.py +63 -0
  71. ksadk/harness/engine/run_control_bridge.py +80 -0
  72. ksadk/harness/engine/run_types.py +88 -0
  73. ksadk/harness/engine/skill_disclosure.py +189 -0
  74. ksadk/harness/engine/spans.py +41 -0
  75. ksadk/harness/engine/subagents.py +343 -0
  76. ksadk/harness/engine/thread_ids.py +112 -0
  77. ksadk/harness/engine/tool_dispatch.py +144 -0
  78. ksadk/harness/event_tree.py +212 -0
  79. ksadk/harness/events.py +461 -0
  80. ksadk/harness/execution_policy.py +94 -0
  81. ksadk/harness/insights.py +210 -0
  82. ksadk/harness/lifecycle.py +578 -0
  83. ksadk/harness/lifecycle_conformance.py +233 -0
  84. ksadk/harness/lifecycle_local_plane.py +104 -0
  85. ksadk/harness/loop/__init__.py +44 -0
  86. ksadk/harness/loop/reason.py +454 -0
  87. ksadk/harness/loop/tools.py +762 -0
  88. ksadk/harness/managed_runtime.py +884 -0
  89. ksadk/harness/mcp_matrix.py +474 -0
  90. ksadk/harness/mcp_runtime.py +471 -0
  91. ksadk/harness/memory_consolidation.py +157 -0
  92. ksadk/harness/memory_loop.py +156 -0
  93. ksadk/harness/memory_runtime.py +541 -0
  94. ksadk/harness/metrics.py +90 -0
  95. ksadk/harness/model_capability.py +253 -0
  96. ksadk/harness/model_provider.py +220 -0
  97. ksadk/harness/observability/__init__.py +29 -0
  98. ksadk/harness/observability/inspection.py +528 -0
  99. ksadk/harness/observability/metrics.py +167 -0
  100. ksadk/harness/observability/otel_exporter.py +218 -0
  101. ksadk/harness/prompt_cache.py +70 -0
  102. ksadk/harness/public_activity.py +154 -0
  103. ksadk/harness/readiness.py +249 -0
  104. ksadk/harness/reasoner.py +466 -13
  105. ksadk/harness/release_readiness.py +140 -0
  106. ksadk/harness/resource_ref.py +69 -0
  107. ksadk/harness/run_control.py +668 -0
  108. ksadk/harness/runtime.py +146 -111
  109. ksadk/harness/runtime_capabilities.py +158 -0
  110. ksadk/harness/runtime_server.py +514 -0
  111. ksadk/harness/sandbox_adapters.py +739 -0
  112. ksadk/harness/sandbox_backend.py +530 -0
  113. ksadk/harness/sandbox_conformance.py +288 -0
  114. ksadk/harness/sandbox_lease.py +77 -0
  115. ksadk/harness/sandbox_lease_conformance.py +259 -0
  116. ksadk/harness/sandbox_matrix.py +170 -0
  117. ksadk/harness/sandbox_reconciliation.py +140 -0
  118. ksadk/harness/sandbox_recovery.py +586 -0
  119. ksadk/harness/sandbox_recovery_conformance.py +246 -0
  120. ksadk/harness/session_store.py +243 -0
  121. ksadk/harness/skill_composition.py +212 -0
  122. ksadk/harness/skill_feedback.py +123 -0
  123. ksadk/harness/skill_matrix.py +233 -0
  124. ksadk/harness/skill_runtime.py +259 -0
  125. ksadk/harness/spec.py +332 -0
  126. ksadk/harness/state.py +153 -0
  127. ksadk/harness/strategies.py +149 -0
  128. ksadk/harness/subagent.py +253 -0
  129. ksadk/harness/tool_policy.py +131 -0
  130. ksadk/harness/tool_receipts.py +96 -0
  131. ksadk/harness/tool_reliability.py +81 -0
  132. ksadk/harness/user_errors.py +69 -0
  133. ksadk/harness/working_context.py +81 -0
  134. ksadk/harness/working_context_patch.py +99 -0
  135. ksadk/identity/resolver.py +18 -0
  136. ksadk/interaction/__init__.py +1 -1
  137. ksadk/interaction/ledger.py +1 -1
  138. ksadk/interaction/provider.py +1 -1
  139. ksadk/interaction/providers/__init__.py +3 -1
  140. ksadk/interaction/providers/adk.py +1 -1
  141. ksadk/interaction/providers/codex.py +1 -1
  142. ksadk/interaction/providers/harness.py +50 -0
  143. ksadk/interaction/providers/langgraph.py +1 -1
  144. ksadk/kernel/__init__.py +10 -0
  145. ksadk/kernel/approval_presentation.py +91 -0
  146. ksadk/kernel/authorization.py +1 -1
  147. ksadk/kernel/bootstrap.py +86 -102
  148. ksadk/kernel/contract_fingerprints.py +1 -1
  149. ksadk/kernel/contracts.py +5 -0
  150. ksadk/kernel/control.py +32 -1
  151. ksadk/kernel/execution_grants.py +221 -0
  152. ksadk/kernel/execution_grants_memory.py +133 -0
  153. ksadk/kernel/execution_grants_postgres.py +217 -0
  154. ksadk/kernel/execution_grants_sqlite.py +209 -0
  155. ksadk/kernel/ingress.py +27 -27
  156. ksadk/kernel/mapping.py +1 -1
  157. ksadk/kernel/memory_store.py +24 -11
  158. ksadk/kernel/postgres_store.py +63 -33
  159. ksadk/kernel/recovery.py +78 -14
  160. ksadk/kernel/sql/001_agent_kernel.sql +23 -0
  161. ksadk/kernel/sqlite_store.py +304 -25
  162. ksadk/kernel/state.py +2 -3
  163. ksadk/kernel/store.py +69 -2
  164. ksadk/kernel/worker.py +79 -41
  165. ksadk/kernel/worker_history.py +72 -0
  166. ksadk/kernel/worker_identity.py +47 -0
  167. ksadk/memory/coordinator.py +22 -6
  168. ksadk/memory/extraction.py +40 -1
  169. ksadk/memory/models.py +77 -1
  170. ksadk/memory/provider_resolver.py +5 -0
  171. ksadk/memory/providers/local_postgres.py +200 -0
  172. ksadk/memory/providers/local_sqlite.py +42 -3
  173. ksadk/memory/retrieval.py +189 -0
  174. ksadk/memory/store_adapter.py +150 -0
  175. ksadk/model_policy.py +2 -2
  176. ksadk/model_proxy/detect.py +254 -0
  177. ksadk/model_proxy/server.py +4 -2
  178. ksadk/model_proxy/transform.py +40 -2
  179. ksadk/plugins/__init__.py +1 -1
  180. ksadk/plugins/bridges/dsh.py +11 -0
  181. ksadk/plugins/builtins.py +40 -2
  182. ksadk/plugins/companion_artifacts.py +83 -0
  183. ksadk/plugins/companions.py +368 -0
  184. ksadk/plugins/contracts.py +1 -1
  185. ksadk/plugins/dsh_channels.py +156 -0
  186. ksadk/plugins/dsh_home.py +140 -0
  187. ksadk/plugins/dsh_teams.py +105 -0
  188. ksadk/plugins/dsh_toolchain.py +101 -19
  189. ksadk/plugins/execution_host.py +99 -0
  190. ksadk/plugins/providers/bundles/dsh-channels-client/client.js +19 -0
  191. ksadk/plugins/providers/bundles/dsh-channels-client/cordis.patch.yml +3 -0
  192. ksadk/plugins/providers/bundles/dsh-channels-client/index.mjs +7 -0
  193. ksadk/plugins/providers/bundles/dsh-channels-client/package.json +12 -0
  194. ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
  195. ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
  196. ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
  197. ksadk/plugins/providers/bundles/dsh-teams-client/client.js +29 -0
  198. ksadk/plugins/providers/bundles/dsh-teams-client/cordis.patch.yml +3 -0
  199. ksadk/plugins/providers/bundles/dsh-teams-client/index.mjs +11 -0
  200. ksadk/plugins/providers/bundles/dsh-teams-client/package.json +35 -0
  201. ksadk/plugins/providers/bundles/dsh-teams-leader-policy/cordis.patch.yml +3 -0
  202. ksadk/plugins/providers/bundles/dsh-teams-leader-policy/index.mjs +13 -0
  203. ksadk/plugins/providers/bundles/dsh-teams-leader-policy/package.json +27 -0
  204. ksadk/plugins/providers/bundles/dsh-teams-profile/cordis.patch.yml +3 -0
  205. ksadk/plugins/providers/bundles/dsh-teams-profile/index.mjs +12 -0
  206. ksadk/plugins/providers/bundles/dsh-teams-profile/package.json +26 -0
  207. ksadk/plugins/providers/bundles/dsh-teams-router/cordis.patch.yml +3 -0
  208. ksadk/plugins/providers/bundles/dsh-teams-router/index.mjs +16 -0
  209. ksadk/plugins/providers/bundles/dsh-teams-router/package.json +27 -0
  210. ksadk/plugins/providers/bundles/dsh-teams-tasks/cordis.patch.yml +3 -0
  211. ksadk/plugins/providers/bundles/dsh-teams-tasks/index.mjs +16 -0
  212. ksadk/plugins/providers/bundles/dsh-teams-tasks/package.json +27 -0
  213. ksadk/plugins/providers/bundles/dsh-teams-tools/cordis.patch.yml +3 -0
  214. ksadk/plugins/providers/bundles/dsh-teams-tools/index.mjs +25 -0
  215. ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +29 -0
  216. ksadk/plugins/providers/bundles/dsh-teams-tools/tools.json +235 -0
  217. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +1 -1
  218. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +51 -1
  219. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +2 -2
  220. ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/client.mjs +133 -0
  221. ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/index.mjs +14 -0
  222. ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +27 -4
  223. ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +9 -5
  224. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
  225. ksadk/plugins/providers/codex.py +10 -2
  226. ksadk/plugins/providers/dsh_capabilities.py +61 -0
  227. ksadk/plugins/providers/harness.py +181 -33
  228. ksadk/plugins/providers/harness_delegation.py +593 -0
  229. ksadk/plugins/providers/harness_managed.py +456 -0
  230. ksadk/plugins/providers/harness_tools.py +326 -0
  231. ksadk/plugins/providers/shipped_dsh.py +4 -1
  232. ksadk/plugins/subagent_providers/codex.py +28 -6
  233. ksadk/plugins/teams/__init__.py +5 -0
  234. ksadk/plugins/teams/api.py +405 -0
  235. ksadk/plugins/teams/application.py +680 -0
  236. ksadk/plugins/teams/artifacts.py +60 -0
  237. ksadk/plugins/teams/context.py +96 -0
  238. ksadk/plugins/teams/contracts.py +136 -0
  239. ksadk/plugins/teams/domain.py +1427 -0
  240. ksadk/plugins/teams/domain_values.py +24 -0
  241. ksadk/plugins/teams/errors.py +13 -0
  242. ksadk/plugins/teams/migration.py +311 -0
  243. ksadk/plugins/teams/migration_cli.py +322 -0
  244. ksadk/plugins/teams/postgres_store.py +138 -0
  245. ksadk/plugins/teams/runtime.py +777 -0
  246. ksadk/plugins/teams/source_projection.py +84 -0
  247. ksadk/plugins/teams/store.py +311 -0
  248. ksadk/plugins/teams/task_decisions.py +423 -0
  249. ksadk/plugins/teams/transport.py +91 -0
  250. ksadk/plugins/teams/workspaces.py +255 -0
  251. ksadk/runners/_langgraph_runner_streams.py +121 -45
  252. ksadk/runners/_langgraph_state_reader.py +106 -0
  253. ksadk/runners/_session_identity.py +285 -0
  254. ksadk/runners/adk_runner.py +25 -60
  255. ksadk/runners/langgraph_runner.py +128 -111
  256. ksadk/runners/patch_langchain.py +47 -0
  257. ksadk/runners/usage_accumulator.py +11 -3
  258. ksadk/runtime/_runner_adapter/stream_mapping.py +52 -2
  259. ksadk/runtime/conversation_execution.py +25 -1
  260. ksadk/runtime/executor.py +9 -1
  261. ksadk/runtime/factory.py +36 -1
  262. ksadk/runtime/preprocessing.py +11 -3
  263. ksadk/runtime/runner_adapter.py +38 -9
  264. ksadk/runtime/skill_eval_result.py +36 -0
  265. ksadk/runtime/timing.py +46 -0
  266. ksadk/runtime/usage.py +49 -18
  267. ksadk/runtime_context.py +103 -1
  268. ksadk/sandbox/backends/e2b.py +245 -23
  269. ksadk/sandbox/backends/local_process.py +63 -39
  270. ksadk/sandbox/base.py +62 -1
  271. ksadk/sandbox/diagnostics.py +82 -0
  272. ksadk/sandbox/local_controls.py +746 -0
  273. ksadk/sandbox/local_launcher.py +90 -0
  274. ksadk/scheduler/dispatcher.py +1 -1
  275. ksadk/server/invocation_identity.py +118 -0
  276. ksadk/server/routes/common.py +32 -3
  277. ksadk/server/routes/control.py +64 -9
  278. ksadk/server/routes/dependencies.py +2 -1
  279. ksadk/server/routes/kernel_ingress.py +9 -1
  280. ksadk/server/routes/misc.py +233 -25
  281. ksadk/server/routes/models.py +3 -3
  282. ksadk/server/routes/openai_compat.py +76 -13
  283. ksadk/server/routes/run.py +106 -35
  284. ksadk/server/routes/sessions.py +244 -68
  285. ksadk/server/routes/workspace.py +130 -21
  286. ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-C1YoaKhx.js} +1 -1
  287. ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-DHuAWfr5.js} +10 -7
  288. ksadk/server/static/assets/MathMessageMarkdown-cvdrBwYr.js +8 -0
  289. ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-DeBkbJvI.js} +9 -9
  290. ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-oJj44_sV.js} +1 -1
  291. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-Dhfv25o2.js} +1 -1
  292. ksadk/server/static/assets/{arc-bTohInsS.js → arc-C35w-pn1.js} +1 -1
  293. ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +1 -0
  294. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-FoMY_u6D.js} +1 -1
  295. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-zD4Rt7oE.js} +1 -1
  296. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.js → c4Diagram-UCG6FXSJ-BCtGGkhN.js} +1 -1
  297. ksadk/server/static/assets/channel-_KDifNys.js +1 -0
  298. ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +1 -0
  299. ksadk/server/static/assets/{chunk-5VM5RSS4-DkhehZDr.js → chunk-5VM5RSS4-C2Ms13_k.js} +1 -1
  300. ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-BoTj-qgx.js} +1 -1
  301. ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-DOMyyjHH.js} +1 -1
  302. ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-DbJJqDli.js} +1 -1
  303. ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CLuRCt_W.js} +1 -1
  304. ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-D0Dz847e.js} +1 -1
  305. ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-BWSRzEcd.js} +1 -1
  306. ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-CPoHqkCY.js} +1 -1
  307. ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.js → chunk-XXDRQBXY-Bx1jS-X-.js} +1 -1
  308. ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +1 -0
  309. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +1 -0
  310. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-Bf9D3tzJ.js → cose-bilkent-JH36ORCC-LzyWm4m0.js} +1 -1
  311. ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +1 -0
  312. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BlW_bHED.js} +1 -1
  313. ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-Bu_S86_i.js} +1 -1
  314. ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-B7nCawed.js} +1 -1
  315. ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-W_Zow2Km.js} +1 -1
  316. ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-CLIKAHON.js} +1 -1
  317. ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-Dv6_QAlN.js} +1 -1
  318. ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-BWAWRDtZ.js} +1 -1
  319. ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-XA_rWMss.js} +1 -1
  320. ksadk/server/static/assets/dist-0X_j2Rcc.js +1 -0
  321. ksadk/server/static/assets/{dist-DiixqL0J.js → dist-1nXCdsej.js} +1 -1
  322. ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-2vL2sAdF.js} +1 -1
  323. ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B3bA05-e.js} +1 -1
  324. ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BLpRy_Yx.js} +1 -1
  325. ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-BO_UwatH.js} +1 -1
  326. ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-BdNFAney.js} +1 -1
  327. ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-C0J5_3qM.js} +1 -1
  328. ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-CGt_UGeO.js} +1 -1
  329. ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-CIRMvUM4.js} +1 -1
  330. ksadk/server/static/assets/{dist-BgV_owcB.js → dist-CIpWk_5f.js} +1 -1
  331. ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-CPyieXEf.js} +1 -1
  332. ksadk/server/static/assets/{dist-btbmmX5O.js → dist-D-92S-Fd.js} +1 -1
  333. ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-DNKuMzWc.js} +1 -1
  334. ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-DWfdmz9s.js} +2 -2
  335. ksadk/server/static/assets/{dist-DVCOWtha.js → dist-DppE_r-D.js} +1 -1
  336. ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-DyG6Ya-z.js} +1 -1
  337. ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-M-SrdhhZ.js} +1 -1
  338. ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-mqD5TZup.js} +1 -1
  339. ksadk/server/static/assets/{dist-Cf125P_m.js → dist-n3n6t_FO.js} +1 -1
  340. ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-qe8xjesy.js} +1 -1
  341. ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-t6MzE0jU.js} +1 -1
  342. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BfCzF1Xi.js} +1 -1
  343. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.js → erDiagram-SSCWMZ5O-Dpz9_0zn.js} +1 -1
  344. ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +1 -0
  345. ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +1 -0
  346. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js → ganttDiagram-EL5Y4UJY-DDaG1f4_.js} +1 -1
  347. ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +1 -0
  348. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js → gitGraphDiagram-WWUBYQGX-DcxzRwYC.js} +1 -1
  349. ksadk/server/static/assets/index-BMd2mucF.css +2 -0
  350. ksadk/server/static/assets/index-D5qyyhTH.js +244 -0
  351. ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +1 -0
  352. ksadk/server/static/assets/{infoDiagram-RXCK75RN-CO0rRTRA.js → infoDiagram-RXCK75RN-CYMdn6lQ.js} +1 -1
  353. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-CLHFAD6c.js} +1 -1
  354. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL-BHSKQGAl.js} +1 -1
  355. ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-D5W3tjTT.js} +1 -1
  356. ksadk/server/static/assets/{katex-B4weu383.js → katex-mtjOi4KM.js} +1 -1
  357. ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-BETqsxE_.js} +1 -1
  358. ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DPWrvs90.js} +2 -2
  359. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.js → mindmap-definition-FBJOCRG2-CJG2mfBP.js} +1 -1
  360. ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +1 -0
  361. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-D7genGLl.js → pegDiagram-XKGWAZYB-GjAPNaqn.js} +1 -1
  362. ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +1 -0
  363. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-ToIewrqr.js} +1 -1
  364. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.js → quadrantDiagram-AXDQQJYC-4d78KiEY.js} +1 -1
  365. ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +1 -0
  366. ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +1 -0
  367. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +1 -0
  368. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +1 -0
  369. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +1 -0
  370. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-CCsh3avW.js → railroadDiagram-O6MQD6OU-DKzx4xfv.js} +1 -1
  371. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CJYljxQS.js} +1 -1
  372. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-DLU2fV1w.js} +1 -1
  373. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-CVqysrA9.js} +1 -1
  374. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-BUxfmTHc.js} +1 -1
  375. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-CNFgYI9E.js} +1 -1
  376. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +1 -0
  377. ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B6qCMe8N.js} +1 -1
  378. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +8 -0
  379. ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.js → timeline-definition-24CTP7MA-CMD3x_U_.js} +1 -1
  380. ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +1 -0
  381. ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +1 -0
  382. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BSKgJsmR.js → vennDiagram-4TSXK5OY-BqtUqvXM.js} +1 -1
  383. ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +1 -0
  384. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-B5KfDjI-.js} +1 -1
  385. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-BaUlSZrn.js} +1 -1
  386. ksadk/server/static/index.html +2 -2
  387. ksadk/server/terminal_sessions.py +34 -2
  388. ksadk/sessions/invocation_identity.py +235 -0
  389. ksadk/skills/__init__.py +26 -0
  390. ksadk/skills/events.py +464 -0
  391. ksadk/skills/manifest_cache.py +263 -0
  392. ksadk/skills/mcp_server/__init__.py +0 -0
  393. ksadk/skills/mcp_server/_registry.py +33 -0
  394. ksadk/skills/mcp_server/_routing.py +26 -0
  395. ksadk/skills/mcp_server/_workspace_files.py +160 -0
  396. ksadk/skills/mcp_server/register.py +415 -0
  397. ksadk/skills/mcp_server/server.py +218 -0
  398. ksadk/skills/models.py +11 -0
  399. ksadk/skills/observability.py +132 -0
  400. ksadk/skills/package_store.py +75 -2
  401. ksadk/skills/runtime/agent.py +38 -5
  402. ksadk/skills/runtime/artifacts.py +87 -0
  403. ksadk/skills/runtime/backends/e2b.py +393 -52
  404. ksadk/skills/runtime/backends/local.py +621 -119
  405. ksadk/skills/runtime/base.py +78 -7
  406. ksadk/skills/runtime/executor.py +266 -1
  407. ksadk/skills/runtime/loader.py +108 -3
  408. ksadk/skills/runtime/request.py +18 -0
  409. ksadk/skills/tool_defs.py +108 -3
  410. ksadk/studio/api.py +592 -57
  411. ksadk/studio/api_contracts.py +8 -2
  412. ksadk/studio/api_plugin_routes.py +39 -12
  413. ksadk/studio/api_resource_connections.py +79 -41
  414. ksadk/studio/authoring.py +12 -6
  415. ksadk/studio/authoring_coordinator.py +4 -2
  416. ksadk/studio/builder.py +12 -0
  417. ksadk/studio/capabilities.py +23 -6
  418. ksadk/studio/channel_connections.py +333 -0
  419. ksadk/studio/cloud.py +30 -10
  420. ksadk/studio/cloud_shared_web.py +75 -2
  421. ksadk/studio/codex_agent_service.py +2 -2
  422. ksadk/studio/codex_builder.py +1 -1
  423. ksadk/studio/codex_run.py +6 -1
  424. ksadk/studio/compiler.py +10 -0
  425. ksadk/studio/configuration.py +182 -0
  426. ksadk/studio/contracts.py +33 -5
  427. ksadk/studio/dsh_application.py +135 -25
  428. ksadk/studio/dsh_capability_service.py +287 -20
  429. ksadk/studio/dsh_lifecycle.py +58 -0
  430. ksadk/studio/dsh_provider_registration.py +55 -16
  431. ksadk/studio/entry.py +53 -0
  432. ksadk/studio/event_store.py +36 -5
  433. ksadk/studio/execution_host.py +525 -0
  434. ksadk/studio/framework_run.py +32 -10
  435. ksadk/studio/hosted_kernel.py +1 -1
  436. ksadk/studio/kernel_registry.py +418 -0
  437. ksadk/studio/kernel_sqlite_migration.py +181 -0
  438. ksadk/studio/model_client.py +1178 -64
  439. ksadk/studio/model_profile_service.py +26 -11
  440. ksadk/studio/native_documents.py +172 -0
  441. ksadk/studio/plugin_composition.py +13 -2
  442. ksadk/studio/plugin_kernel_adapter.py +15 -0
  443. ksadk/studio/plugin_lifecycle.py +80 -0
  444. ksadk/studio/plugin_runtime.py +230 -17
  445. ksadk/studio/provider_recovery.py +59 -0
  446. ksadk/studio/recovery_page.py +70 -0
  447. ksadk/studio/resource_authority.py +59 -32
  448. ksadk/studio/resource_catalog.py +6 -0
  449. ksadk/studio/run_activity.py +895 -0
  450. ksadk/studio/run_documents.py +127 -0
  451. ksadk/studio/run_service.py +329 -33
  452. ksadk/studio/runtime_catalog.py +53 -10
  453. ksadk/studio/runtime_source.py +1 -1
  454. ksadk/studio/scheduler_runtime.py +32 -289
  455. ksadk/studio/service.py +398 -103
  456. ksadk/studio/shared_web.py +149 -36
  457. ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +8 -0
  458. ksadk/studio/static/assets/CodeBlock-DMIf4h33-UIqo-BPW.js +44 -0
  459. ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
  460. ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-OhNwH4K9.js +8 -0
  461. ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
  462. ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-g0I-I4dD.js +59 -0
  463. ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
  464. ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +3 -0
  465. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-Bnb1O3tA.js +1 -0
  466. ksadk/studio/static/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
  467. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-5Zn1gqJv.js +36 -0
  468. ksadk/studio/static/assets/{blockDiagram-I7D4REHJ-CFmPl1de.js → blockDiagram-I7D4REHJ-CLB4L11u.js} +6 -6
  469. ksadk/studio/static/assets/{c4Diagram-7LVT6UL2-BRrGu8qt.js → c4Diagram-7LVT6UL2-BOma_Z_F.js} +7 -7
  470. ksadk/studio/static/assets/channel-r8itPEik.js +1 -0
  471. ksadk/studio/static/assets/chunk-2E4U76K2-BFf_huql.js +2 -0
  472. ksadk/studio/static/assets/chunk-2ZTRR5NV-C2qZJila.js +2 -0
  473. ksadk/studio/static/assets/chunk-3Z5EZCMW-DMniOlPd.js +1 -0
  474. ksadk/studio/static/assets/{chunk-4HAMMTFA-D220vUtq.js → chunk-4HAMMTFA-DVtDP4rm.js} +7 -7
  475. ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
  476. ksadk/studio/static/assets/chunk-6AZGARVD-BB6FqMl-.js +1 -0
  477. ksadk/studio/static/assets/chunk-6EIED4P4-DdUJkP0f.js +1 -0
  478. ksadk/studio/static/assets/chunk-6K3QC6MW-CqVsVn-y.js +1 -0
  479. ksadk/studio/static/assets/chunk-6TQVIW2G-DKlLbNIP.js +1 -0
  480. ksadk/studio/static/assets/chunk-747NJXEK-BFkZPlab.js +2 -0
  481. ksadk/studio/static/assets/chunk-75Z2AOVW-BZNhM4vB.js +2 -0
  482. ksadk/studio/static/assets/chunk-CLGD4ZFX-D-GTtyKs.js +1 -0
  483. ksadk/studio/static/assets/{chunk-DU6HZSFF-C4DtVpCu.js → chunk-DU6HZSFF-CpEZCUgg.js} +1 -1
  484. ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
  485. ksadk/studio/static/assets/{chunk-GMAD6QVW-DiQA-u2N.js → chunk-GMAD6QVW-DE_8H717.js} +6 -6
  486. ksadk/studio/static/assets/chunk-GVQU2GXP-BfEB0lNv.js +1 -0
  487. ksadk/studio/static/assets/chunk-I5DQTOEV-Hm2LfiYI.js +1 -0
  488. ksadk/studio/static/assets/chunk-ICYGCRZG-749o-pGJ.js +1 -0
  489. ksadk/studio/static/assets/chunk-IH6LHLGP-CC6I9F3i.js +1 -0
  490. ksadk/studio/static/assets/{chunk-IMKFNOWR-BSlbjT_b.js → chunk-IMKFNOWR-D38axYOR.js} +5 -5
  491. ksadk/studio/static/assets/chunk-KI3K4JFJ-Rma-0k_M.js +1 -0
  492. ksadk/studio/static/assets/chunk-L3NEJ4N5-Dq5xn7aL.js +1 -0
  493. ksadk/studio/static/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
  494. ksadk/studio/static/assets/{chunk-OSK3NFVY-M2m6G3j4.js → chunk-OSK3NFVY-DiCQjx9b.js} +5 -5
  495. ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
  496. ksadk/studio/static/assets/{chunk-P2QGCYS3-DezaQxiK.js → chunk-P2QGCYS3-VdhKmfYq.js} +1 -1
  497. ksadk/studio/static/assets/chunk-POPQ4Y6H-C1_rzO5M.js +1 -0
  498. ksadk/studio/static/assets/chunk-PWAF6VOD-B45HvflI.js +1 -0
  499. ksadk/studio/static/assets/{chunk-SHT3W25Y-DAyIVp5H.js → chunk-SHT3W25Y-DsCFnRVE.js} +9 -9
  500. ksadk/studio/static/assets/{chunk-SVP7TREG-DulomOrS.js → chunk-SVP7TREG-DljApgRX.js} +1 -1
  501. ksadk/studio/static/assets/{chunk-TICWLB2K-bHJYoflj.js → chunk-TICWLB2K-DWqRtyqa.js} +6 -6
  502. ksadk/studio/static/assets/chunk-TLUHSLCS-DUeGgnD5.js +2 -0
  503. ksadk/studio/static/assets/chunk-UY3FDG6J-CnmaAkG5.js +1 -0
  504. ksadk/studio/static/assets/chunk-XHIXRSVI-BFQ6B8BE.js +1 -0
  505. ksadk/studio/static/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
  506. ksadk/studio/static/assets/classDiagram-ZZMXUADV-DjeMNJmu.js +1 -0
  507. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-DjeMNJmu.js +1 -0
  508. ksadk/studio/static/assets/clsx-DB0hHKMi.js +1 -0
  509. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-om8AY0Mc.js +1 -0
  510. ksadk/studio/static/assets/createLucideIcon-DR0LGTP5.js +1 -0
  511. ksadk/studio/static/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
  512. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-6BrmK52S.js +62 -0
  513. ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
  514. ksadk/studio/static/assets/{diagram-S7CK7UJ4-0BZ98mya.js → diagram-S7CK7UJ4-C6aH78c4.js} +3 -3
  515. ksadk/studio/static/assets/diagram-UQ7AKVKN-DY_tQ6C_.js +41 -0
  516. ksadk/studio/static/assets/diagram-VSXAHHWV-DX9p5cQT.js +3 -0
  517. ksadk/studio/static/assets/diagram-VX7I27RA-DB2WSH8X.js +24 -0
  518. ksadk/studio/static/assets/diagram-Z3DM3KII-Ce1BJwHE.js +24 -0
  519. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
  520. ksadk/studio/static/assets/{erDiagram-RLTQ6QDP-DLGry2Ap.js → erDiagram-RLTQ6QDP-CGthTMmJ.js} +6 -6
  521. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
  522. ksadk/studio/static/assets/flowDiagram-HODETNUW-CZ1tEenp.js +1 -0
  523. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BfoAZW9X.js +292 -0
  524. ksadk/studio/static/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
  525. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-S985OIJF.js +106 -0
  526. ksadk/studio/static/assets/iconfont-4HN3C9Pg.woff2 +0 -0
  527. ksadk/studio/static/assets/index-CfEnms6Y.css +2 -0
  528. ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
  529. ksadk/studio/static/assets/index.dom-BQenBtFm.js +1 -0
  530. ksadk/studio/static/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
  531. ksadk/studio/static/assets/infoDiagram-27XIBGKW-CO3W8tFn.js +2 -0
  532. ksadk/studio/static/assets/{ishikawaDiagram-5VMMS53U-CljI2wyf.js → ishikawaDiagram-5VMMS53U-BUGEl8cO.js} +2 -2
  533. ksadk/studio/static/assets/{journeyDiagram-3NMN7TZE-D50Fo2sL.js → journeyDiagram-3NMN7TZE-Ch2ZYxvr.js} +6 -6
  534. ksadk/studio/static/assets/{kanban-definition-UXKFOSKX-DimfOTam.js → kanban-definition-UXKFOSKX-Da-Fp4vC.js} +3 -3
  535. ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
  536. ksadk/studio/static/assets/{line-CX5BOOUP.js → line-BDaeq300.js} +1 -1
  537. ksadk/studio/static/assets/linear-DmucvK78.js +1 -0
  538. ksadk/studio/static/assets/mermaid-parser.core-Cj5mYdBi.js +4 -0
  539. ksadk/studio/static/assets/{mindmap-definition-YA3MSWOX-Bizzqy5R.js → mindmap-definition-YA3MSWOX-CvlsVQ38.js} +1 -1
  540. ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
  541. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-BuHuNgT5.js +1 -0
  542. ksadk/studio/static/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
  543. ksadk/studio/static/assets/{pieDiagram-E7YTZNPT-B9mrFSDF.js → pieDiagram-E7YTZNPT-DlrWiSOv.js} +1 -1
  544. ksadk/studio/static/assets/preload-helper-CO68xz6u.js +1 -0
  545. ksadk/studio/static/assets/presentation-yYw7xK60-BmcZriri.js +1 -0
  546. ksadk/studio/static/assets/{quadrantDiagram-AXDQQJYC-NzUfCbMR.js → quadrantDiagram-AXDQQJYC-BA3hpUZM.js} +6 -6
  547. ksadk/studio/static/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
  548. ksadk/studio/static/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
  549. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
  550. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
  551. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
  552. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-BxpAazym.js +1 -0
  553. ksadk/studio/static/assets/{requirementDiagram-BXWQKSXE-BF3d103U.js → requirementDiagram-BXWQKSXE-E-Ge0FcV.js} +1 -1
  554. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
  555. ksadk/studio/static/assets/{sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js → sequenceDiagram-WJ2MYXX4-CcElXGg4.js} +9 -9
  556. ksadk/studio/static/assets/src-B6xuSHsQ.js +1 -0
  557. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DdXZOFqY.js +1 -0
  558. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-CJbOM-QK.js +1 -0
  559. ksadk/studio/static/assets/swimlanes-42K2YHIH-NtgEEHLY.js +1 -0
  560. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-D-AVlW8B.js +8 -0
  561. ksadk/studio/static/assets/{timeline-definition-24CTP7MA-DxmSSjRB.js → timeline-definition-24CTP7MA-CIuYhNy3.js} +7 -7
  562. ksadk/studio/static/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
  563. ksadk/studio/static/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
  564. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-7HbApbrv.js +34 -0
  565. ksadk/studio/static/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
  566. ksadk/studio/static/assets/{wardleyDiagram-VM6X3IG4-Ba1AOWoe.js → wardleyDiagram-VM6X3IG4-CMJiaedy.js} +1 -1
  567. ksadk/studio/static/assets/{xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js → xychartDiagram-S5SC5T6Z-BdgtMvW2.js} +6 -6
  568. ksadk/studio/static/index.html +8 -2
  569. ksadk/studio/teams_catalog.py +133 -0
  570. ksadk/studio/teams_installation.py +214 -0
  571. ksadk/studio/teams_node.py +545 -0
  572. ksadk/studio/teams_node_runner.py +69 -0
  573. ksadk/studio/teams_remote.py +274 -0
  574. ksadk/studio/templates.py +40 -19
  575. ksadk/studio/validator.py +13 -0
  576. ksadk/studio/workspace.py +19 -4
  577. ksadk/studio/workspace_plugins.py +136 -0
  578. ksadk/studio/workspace_registry.py +286 -0
  579. ksadk/toolsets/__init__.py +11 -0
  580. ksadk/toolsets/skills.py +446 -378
  581. ksadk/toolsets/workspace.py +3 -3
  582. ksadk/toolsets/workspace_identity.py +15 -0
  583. ksadk/version.py +1 -1
  584. ksadk_runtime_common/memory_backend/providers/lancedb.py +56 -2
  585. ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -148
  586. ksadk_runtime_common/workspace_files/router.py +26 -13
  587. ksadk/server/static/assets/MathMessageMarkdown-DbdW5A4_.js +0 -8
  588. ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +0 -1
  589. ksadk/server/static/assets/channel-CF5Up3hQ.js +0 -1
  590. ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +0 -1
  591. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +0 -1
  592. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +0 -1
  593. ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +0 -1
  594. ksadk/server/static/assets/dist-B2_CVgKv.js +0 -1
  595. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +0 -1
  596. ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +0 -1
  597. ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +0 -1
  598. ksadk/server/static/assets/index-DcTML1Up.css +0 -2
  599. ksadk/server/static/assets/index-Dh2XHqPK.js +0 -244
  600. ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +0 -1
  601. ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +0 -1
  602. ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +0 -1
  603. ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +0 -1
  604. ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +0 -1
  605. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +0 -1
  606. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +0 -1
  607. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +0 -1
  608. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +0 -1
  609. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +0 -8
  610. ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +0 -1
  611. ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +0 -1
  612. ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +0 -1
  613. ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +0 -41
  614. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +0 -8
  615. ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +0 -44
  616. ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +0 -3
  617. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +0 -1
  618. ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +0 -1
  619. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +0 -36
  620. ksadk/studio/static/assets/channel-BqO-gtEw.js +0 -1
  621. ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +0 -2
  622. ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +0 -1
  623. ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +0 -1
  624. ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +0 -1
  625. ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +0 -1
  626. ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +0 -1
  627. ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +0 -1
  628. ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +0 -1
  629. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +0 -1
  630. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +0 -1
  631. ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +0 -1
  632. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +0 -62
  633. ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +0 -4
  634. ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +0 -41
  635. ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +0 -3
  636. ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +0 -24
  637. ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +0 -24
  638. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +0 -1
  639. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +0 -1
  640. ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +0 -1
  641. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +0 -292
  642. ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +0 -1
  643. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +0 -106
  644. ksadk/studio/static/assets/index-CeHL9ARV.css +0 -2
  645. ksadk/studio/static/assets/index-D9QEcVpL.js +0 -320
  646. ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +0 -1
  647. ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +0 -2
  648. ksadk/studio/static/assets/linear-BCxN9JLv.js +0 -1
  649. ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +0 -7
  650. ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +0 -1
  651. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +0 -1
  652. ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +0 -1
  653. ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +0 -1
  654. ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +0 -1
  655. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +0 -1
  656. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +0 -1
  657. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +0 -1
  658. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +0 -1
  659. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +0 -40
  660. ksadk/studio/static/assets/src-SFn9St9H.js +0 -1
  661. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +0 -1
  662. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +0 -1
  663. ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +0 -1
  664. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +0 -8
  665. ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +0 -1
  666. ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +0 -1
  667. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +0 -34
  668. ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +0 -1
  669. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/WHEEL +0 -0
  670. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/entry_points.txt +0 -0
  671. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/licenses/LICENSE +0 -0
  672. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/top_level.txt +0 -0
  673. /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
@@ -18,6 +18,7 @@ def project_session_messages(
18
18
  include_reasoning: bool = False,
19
19
  include_tool_events: bool = False,
20
20
  include_attachments: bool = True,
21
+ session_id: str | None = None,
21
22
  ) -> list[dict[str, Any]]:
22
23
  """Project persisted runtime events into the chat history contract.
23
24
 
@@ -53,7 +54,17 @@ def project_session_messages(
53
54
  approval_responses=approval_responses,
54
55
  )
55
56
  )
56
- return sorted(messages, key=lambda item: int(item.get("SeqId") or 0))
57
+ projected = sorted(messages, key=lambda item: int(item.get("SeqId") or 0))
58
+ if session_id:
59
+ for message in projected:
60
+ for attachment in message.get("Attachments") or []:
61
+ file_uri = str(attachment.get("file_uri") or "")
62
+ if file_uri.startswith(("ksadk-upload://", "ae-upload://")):
63
+ attachment["url"] = (
64
+ "/agentengine/api/v1/AttachmentContent?FileUri="
65
+ f"{quote(file_uri, safe='')}&SessionId={quote(str(session_id), safe='')}"
66
+ )
67
+ return projected
57
68
 
58
69
 
59
70
  def _project_event_group(
@@ -119,8 +130,7 @@ def _project_event_group(
119
130
  # emit a placeholder assistant message for them first.
120
131
  if has_pre_assistant_approvals and not assistant_seen:
121
132
  anchor = next(
122
- (e for e in events
123
- if str(e.get("EventType") or "") == "approval_request"),
133
+ (e for e in events if str(e.get("EventType") or "") == "approval_request"),
124
134
  events[0],
125
135
  )
126
136
  placeholder = _base_message(anchor, "assistant", content="")
@@ -224,9 +234,7 @@ def _project_interleaved_blocks(
224
234
  saw_stream_text = False
225
235
  saw_reasoning_after_stream_text = False
226
236
  tools_by_seq_id = {
227
- int(tool.get("SeqId") or 0): tool
228
- for tool in tool_events
229
- if int(tool.get("SeqId") or 0) > 0
237
+ int(tool.get("SeqId") or 0): tool for tool in tool_events if int(tool.get("SeqId") or 0) > 0
230
238
  }
231
239
 
232
240
  def append_text(text: str, seq_id: Any) -> None:
@@ -493,9 +501,7 @@ def _project_approval_events(
493
501
  )
494
502
  if not isinstance(first_action, Mapping):
495
503
  first_action = {}
496
- interaction_id = runtime_event.get("interaction_id") or req.get(
497
- "call_id"
498
- )
504
+ interaction_id = runtime_event.get("interaction_id") or req.get("call_id")
499
505
  interrupt_info = {
500
506
  "approval_request_id": interaction_id,
501
507
  "id": interaction_id,
@@ -528,17 +534,11 @@ def _project_approval_events(
528
534
  # 这里统一提取,避免 Name fallback 成 "approval" 导致前端显示不对。
529
535
  action_requests = interrupt_info.get("action_requests")
530
536
  first_action = (
531
- action_requests[0]
532
- if isinstance(action_requests, list) and action_requests
533
- else {}
537
+ action_requests[0] if isinstance(action_requests, list) and action_requests else {}
534
538
  )
535
539
  if not isinstance(first_action, Mapping):
536
540
  first_action = {}
537
- tool_name = (
538
- interrupt_info.get("tool_name")
539
- or first_action.get("name")
540
- or "approval"
541
- )
541
+ tool_name = interrupt_info.get("tool_name") or first_action.get("name") or "approval"
542
542
  entry: dict[str, Any] = {
543
543
  "SeqId": request.get("SeqId"),
544
544
  "Type": "approval",
@@ -559,10 +559,7 @@ def _project_approval_events(
559
559
  )
560
560
  if arguments is not None:
561
561
  entry["Args"] = arguments
562
- description = (
563
- interrupt_info.get("description")
564
- or first_action.get("description")
565
- )
562
+ description = interrupt_info.get("description") or first_action.get("description")
566
563
  if description:
567
564
  entry["Description"] = str(description)
568
565
  review_configs = interrupt_info.get("review_configs")
@@ -721,7 +718,7 @@ def _normalize_canonical_event(
721
718
  initial = runtime_event.get("initial") or {}
722
719
  parts = initial.get("parts") if isinstance(initial, Mapping) else []
723
720
  data: Any = {}
724
- for part in (parts or []):
721
+ for part in parts or []:
725
722
  if isinstance(part, Mapping) and part.get("content_type") == "data":
726
723
  data = part.get("data")
727
724
  break
@@ -821,9 +818,7 @@ def _normalize_canonical_event(
821
818
  # 嵌在 action_requests[0] 里,detail 顶层没有,需要提取。
822
819
  action_requests = detail.get("action_requests")
823
820
  first_action = (
824
- action_requests[0]
825
- if isinstance(action_requests, list) and action_requests
826
- else {}
821
+ action_requests[0] if isinstance(action_requests, list) and action_requests else {}
827
822
  )
828
823
  if not isinstance(first_action, Mapping):
829
824
  first_action = {}
@@ -833,20 +828,16 @@ def _normalize_canonical_event(
833
828
  normalized_metadata["interrupt_info"] = {
834
829
  "approval_request_id": interaction_id or call_id,
835
830
  "id": interaction_id or call_id,
836
- "tool_name": detail.get("tool_name")
837
- or first_action.get("name")
838
- or kind,
831
+ "tool_name": detail.get("tool_name") or first_action.get("name") or kind,
839
832
  "arguments": detail.get("arguments")
840
833
  or detail.get("args")
841
834
  or first_action.get("args")
842
835
  or first_action.get("arguments"),
843
- "description": detail.get("description")
844
- or first_action.get("description"),
836
+ "description": detail.get("description") or first_action.get("description"),
845
837
  "review_configs": review_configs if isinstance(review_configs, list) else None,
846
838
  "approval_level": detail.get("approval_level")
847
839
  or first_action.get("approval_level"),
848
- "approval_message": detail.get("message")
849
- or first_action.get("description"),
840
+ "approval_message": detail.get("message") or first_action.get("description"),
850
841
  }
851
842
  # Preserve ag-ui protocol tag from source metadata.
852
843
  source = runtime_event.get("source") or {}
@@ -290,7 +290,9 @@ def compact_attachment_for_session(attachment: Dict[str, Any]) -> Dict[str, Any]
290
290
  }
291
291
 
292
292
 
293
- def attachment_from_part(part: Part) -> Optional[Dict[str, Any]]:
293
+ def attachment_from_part(
294
+ part: Part, *, owner_scope_ref: str | None = None
295
+ ) -> Optional[Dict[str, Any]]:
294
296
  inline = part.inlineData
295
297
  if inline and inline.data:
296
298
  display_name = inline.displayName or "uploaded_file"
@@ -312,7 +314,9 @@ def attachment_from_part(part: Part) -> Optional[Dict[str, Any]]:
312
314
  if file_data and (file_data.fileUri or file_data.displayName):
313
315
  display_name = file_data.displayName or file_data.fileUri or "uploaded_file"
314
316
  mime_type = (file_data.mimeType or "").strip() or "application/octet-stream"
315
- storage_path = resolve_attachment_storage_path(file_data.fileUri or "")
317
+ storage_path = resolve_attachment_storage_path(
318
+ file_data.fileUri or "", owner_scope_ref=owner_scope_ref
319
+ )
316
320
  try:
317
321
  size_bytes = (
318
322
  storage_path.stat().st_size if storage_path and storage_path.exists() else None
@@ -357,9 +361,15 @@ def display_content_from_parts(parts: List[Part]) -> str:
357
361
  return "\n\n".join(blocks).strip()
358
362
 
359
363
 
360
- def normalize_parts_content(parts: List[Part]) -> dict[str, Any]:
364
+ def normalize_parts_content(
365
+ parts: List[Part], *, owner_scope_ref: str | None = None
366
+ ) -> dict[str, Any]:
361
367
  attachments = [
362
- attachment for attachment in (attachment_from_part(part) for part in parts) if attachment
368
+ attachment
369
+ for attachment in (
370
+ attachment_from_part(part, owner_scope_ref=owner_scope_ref) for part in parts
371
+ )
372
+ if attachment
363
373
  ]
364
374
  attachment_results = build_attachment_results(attachments)
365
375
  display_content = display_content_from_parts(parts)
@@ -383,7 +393,9 @@ def normalize_parts_content(parts: List[Part]) -> dict[str, Any]:
383
393
  }
384
394
 
385
395
 
386
- def normalize_kop_message_content(content: Any) -> dict[str, Any]:
396
+ def normalize_kop_message_content(
397
+ content: Any, *, owner_scope_ref: str | None = None
398
+ ) -> dict[str, Any]:
387
399
  input_content = canonical_input_content_from_message_content(content)
388
400
  if isinstance(content, list):
389
401
  parts: List[Part] = []
@@ -397,7 +409,7 @@ def normalize_kop_message_content(content: Any) -> dict[str, Any]:
397
409
  parts.append(Part.model_validate(payload))
398
410
  except Exception:
399
411
  continue
400
- normalized = normalize_parts_content(parts)
412
+ normalized = normalize_parts_content(parts, owner_scope_ref=owner_scope_ref)
401
413
  normalized["input_content"] = input_content
402
414
  return normalized
403
415
  text = str(content or "")
@@ -411,11 +423,15 @@ def normalize_kop_message_content(content: Any) -> dict[str, Any]:
411
423
  }
412
424
 
413
425
 
414
- def normalize_kop_messages(messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
426
+ def normalize_kop_messages(
427
+ messages: List[Dict[str, Any]], *, owner_scope_ref: str | None = None
428
+ ) -> List[Dict[str, Any]]:
415
429
  normalized: List[Dict[str, Any]] = []
416
430
  for message in messages or []:
417
431
  role = str(message.get("role") or "user")
418
- normalized_content = normalize_kop_message_content(message.get("content", ""))
432
+ normalized_content = normalize_kop_message_content(
433
+ message.get("content", ""), owner_scope_ref=owner_scope_ref
434
+ )
419
435
  normalized.append(
420
436
  {
421
437
  "role": role,
@@ -430,7 +446,9 @@ def normalize_kop_messages(messages: List[Dict[str, Any]]) -> List[Dict[str, Any
430
446
  return normalized
431
447
 
432
448
 
433
- def normalize_responses_input(input_payload: Any) -> List[Dict[str, Any]]:
449
+ def normalize_responses_input(
450
+ input_payload: Any, *, owner_scope_ref: str | None = None
451
+ ) -> List[Dict[str, Any]]:
434
452
  if isinstance(input_payload, str):
435
453
  return [
436
454
  {
@@ -446,5 +464,5 @@ def normalize_responses_input(input_payload: Any) -> List[Dict[str, Any]]:
446
464
  }
447
465
  ]
448
466
  if isinstance(input_payload, list):
449
- return normalize_kop_messages(input_payload)
467
+ return normalize_kop_messages(input_payload, owner_scope_ref=owner_scope_ref)
450
468
  return []
@@ -0,0 +1,37 @@
1
+ """Context-engine baseline recording kept outside the stream hot path."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import time
6
+ from collections.abc import Mapping
7
+ from typing import Any
8
+
9
+
10
+ def record_baseline_turn(
11
+ *,
12
+ prepared: Any,
13
+ model: str | None,
14
+ usage: Any,
15
+ ptl: bool,
16
+ attempts: int,
17
+ turn_start_monotonic: float | None,
18
+ ) -> None:
19
+ """Record one env-gated baseline turn without affecting decisions."""
20
+
21
+ from ksadk.context_engine.baseline import record_baseline_turn as record
22
+
23
+ latency_ms = None
24
+ if turn_start_monotonic is not None:
25
+ latency_ms = int((time.monotonic() - turn_start_monotonic) * 1000)
26
+ record(
27
+ getattr(prepared, "shadow_context_plan", None),
28
+ session_id=getattr(prepared, "session_id", ""),
29
+ invocation_id=getattr(prepared, "invocation_id", ""),
30
+ model=str(model or ""),
31
+ usage=usage if isinstance(usage, Mapping) else None,
32
+ compaction_triggered=bool(getattr(prepared, "compaction_triggered", False)),
33
+ compaction_trigger=str(getattr(prepared, "compaction_trigger", "") or ""),
34
+ prompt_too_long=ptl,
35
+ retry_attempts=attempts,
36
+ turn_latency_ms=latency_ms,
37
+ )
@@ -40,6 +40,7 @@ from ksadk.conversations.runtime_observability import (
40
40
  _set_conversation_usage_attributes,
41
41
  _set_prompt_cache_attributes,
42
42
  _set_prompt_source_attributes,
43
+ _set_skill_eval_result_attributes,
43
44
  _span_feedback_metadata,
44
45
  )
45
46
  from ksadk.conversations.runtime_persistence import (
@@ -55,7 +56,10 @@ from ksadk.conversations.runtime_resume import (
55
56
  _merge_agentengine_metadata,
56
57
  )
57
58
  from ksadk.model_policy import fallback_model_for_exception, model_policy_options_for_model
59
+ from ksadk.runtime.skill_eval_result import skill_eval_response_fields
58
60
  from ksadk.runtime_context import (
61
+ TRUSTED_IDENTITY_METADATA_KEY,
62
+ PlatformIdentityContext,
59
63
  PlatformInvocationContext,
60
64
  platform_invocation_scope,
61
65
  tool_execution_scope,
@@ -180,9 +184,13 @@ async def invoke_conversation_once(
180
184
  )
181
185
  raise
182
186
  _inject_runner_deferred_tools_for_request(runner, prepared)
187
+ effective_user_id = prepared.user_id or user_id
188
+ invocation_identity = PlatformIdentityContext.from_payload(
189
+ dict(request_metadata or {}).get(TRUSTED_IDENTITY_METADATA_KEY)
190
+ )
183
191
  ambient_contexts = _build_runner_ambient_contexts(
184
192
  runner=runner,
185
- user_id=user_id,
193
+ user_id=effective_user_id,
186
194
  user_input=prepared.user_input,
187
195
  )
188
196
  prepared.memory_recall_events = ambient_contexts.get("memory_recall_events", [])
@@ -191,7 +199,7 @@ async def invoke_conversation_once(
191
199
  runtime_context = PlatformInvocationContext(
192
200
  session=SessionContext.from_payload(prepared.session_context),
193
201
  agent_id=agent_id,
194
- user_id=user_id,
202
+ user_id=effective_user_id,
195
203
  account_id=str(account_id or ""),
196
204
  session_id=prepared.session_id,
197
205
  history=list(prepared.history),
@@ -210,13 +218,14 @@ async def invoke_conversation_once(
210
218
  kb_context=ambient_contexts.get("kb_context"),
211
219
  memory_context=ambient_contexts.get("memory_context"),
212
220
  tool_approval_mode=str(prepared.request_metadata.get("tool_approval_mode") or ""),
221
+ identity=invocation_identity,
213
222
  )
214
223
  runner_name = _runner_name(runner)
215
224
  async with _conversation_span_scope(runner_name) as span:
216
225
  _set_conversation_span_attributes(
217
226
  span,
218
227
  agent_id=agent_id,
219
- user_id=user_id,
228
+ user_id=effective_user_id,
220
229
  session_id=prepared.session_id,
221
230
  invocation_id=prepared.invocation_id,
222
231
  runner_name=runner_name,
@@ -354,6 +363,9 @@ async def invoke_conversation_once(
354
363
  if last_invoke_error is not None:
355
364
  raise last_invoke_error
356
365
  result = result or {}
366
+ result_fields = skill_eval_response_fields(result)
367
+ if result_fields:
368
+ _set_skill_eval_result_attributes(span, result_fields["skill_eval_result"])
357
369
  output_text = strip_reasoning_markup(str(result.get("output", "")))
358
370
  result_usage = _normalize_usage_payload(result.get("usage"))
359
371
  result_last_usage = _normalize_usage_payload(
@@ -434,7 +446,7 @@ async def invoke_conversation_once(
434
446
  )
435
447
  await _auto_save_ltm_turn(
436
448
  agent_id=agent_id,
437
- user_id=user_id,
449
+ user_id=effective_user_id,
438
450
  prepared=prepared,
439
451
  output_text=output_text,
440
452
  runner_type=runtime_context.runner_type,
@@ -450,6 +462,7 @@ async def invoke_conversation_once(
450
462
  run_trigger=run_trigger,
451
463
  )
452
464
  result_payload: dict[str, Any] = {
465
+ **result_fields,
453
466
  "output_text": output_text,
454
467
  "model": model,
455
468
  "metadata": {
@@ -45,6 +45,8 @@ def _normalize_usage_payload(usage: Mapping[str, Any] | None) -> dict[str, Any]:
45
45
  "total_tokens",
46
46
  "prompt_tokens",
47
47
  "completion_tokens",
48
+ "cached_tokens",
49
+ "reasoning_tokens",
48
50
  ):
49
51
  value = usage.get(key)
50
52
  if value is None:
@@ -57,6 +59,23 @@ def _normalize_usage_payload(usage: Mapping[str, Any] | None) -> dict[str, Any]:
57
59
  value = usage.get(key)
58
60
  if isinstance(value, Mapping):
59
61
  normalized[key] = dict(value)
62
+ for source_key, target_key in (
63
+ ("input_tokens_details", "input_token_details"),
64
+ ("output_tokens_details", "output_token_details"),
65
+ ):
66
+ value = usage.get(source_key)
67
+ if isinstance(value, Mapping) and target_key not in normalized:
68
+ normalized[target_key] = dict(value)
69
+ cached_tokens = normalized.get("cached_tokens")
70
+ if cached_tokens is not None:
71
+ input_details = normalized.setdefault("input_token_details", {})
72
+ if not any(key in input_details for key in ("cached_tokens", "cached", "cache_read")):
73
+ input_details["cached"] = cached_tokens
74
+ reasoning_tokens = normalized.get("reasoning_tokens")
75
+ if reasoning_tokens is not None:
76
+ output_details = normalized.setdefault("output_token_details", {})
77
+ if not any(key in output_details for key in ("reasoning_tokens", "reasoning")):
78
+ output_details["reasoning"] = reasoning_tokens
60
79
  prompt_details = usage.get("prompt_tokens_details")
61
80
  if isinstance(prompt_details, Mapping):
62
81
  normalized["prompt_tokens_details"] = dict(prompt_details)
@@ -339,10 +358,21 @@ def _set_conversation_output_attributes(span: Any | None, output_text: str | Non
339
358
  _set_span_attribute(span, key, text)
340
359
 
341
360
 
361
+ def _set_skill_eval_result_attributes(span: Any | None, result: Mapping[str, Any]) -> None:
362
+ """Attach structured evidence without changing trace/observation output text."""
363
+ payload = json.dumps({"skill_eval_result": dict(result)}, ensure_ascii=False)
364
+ _set_span_attribute(span, "metadata", payload)
365
+ _set_span_attribute(
366
+ span, "langfuse.trace.metadata.skill_eval_result",
367
+ json.dumps(dict(result), ensure_ascii=False),
368
+ )
369
+
370
+
342
371
  def _set_conversation_usage_attributes(
343
372
  span: Any | None,
344
373
  usage: Mapping[str, Any] | None,
345
374
  ) -> None:
375
+ """Write run-level usage as KsADK diagnostics, never as model generation usage."""
346
376
  normalized = _normalize_usage_payload(usage)
347
377
  if not normalized:
348
378
  return
@@ -372,19 +402,14 @@ def _set_conversation_usage_attributes(
372
402
  )
373
403
 
374
404
  attributes = {
375
- "gen_ai.usage.input_tokens": input_tokens,
376
- "gen_ai.usage.output_tokens": output_tokens,
377
- "gen_ai.usage.total_tokens": total_tokens,
378
- "llm.usage.prompt_tokens": input_tokens,
379
- "llm.usage.completion_tokens": output_tokens,
380
- "llm.usage.total_tokens": total_tokens,
405
+ "ksadk.runtime.usage.input_tokens": input_tokens,
406
+ "ksadk.runtime.usage.output_tokens": output_tokens,
407
+ "ksadk.runtime.usage.total_tokens": total_tokens,
381
408
  }
382
409
  if cache_read_tokens:
383
- attributes["gen_ai.usage.cache_read.input_tokens"] = cache_read_tokens
384
- attributes["llm.usage.cache_read.input_tokens"] = cache_read_tokens
410
+ attributes["ksadk.runtime.usage.cache_read.input_tokens"] = cache_read_tokens
385
411
  if reasoning_tokens:
386
- attributes["gen_ai.usage.reasoning.output_tokens"] = reasoning_tokens
387
- attributes["llm.usage.reasoning_tokens"] = reasoning_tokens
412
+ attributes["ksadk.runtime.usage.reasoning.output_tokens"] = reasoning_tokens
388
413
 
389
414
  for key, value in attributes.items():
390
415
  if value:
@@ -405,6 +430,10 @@ def _set_conversation_span_attributes(
405
430
  if span is None:
406
431
  return
407
432
  try:
433
+ # A conversation span wraps the whole run. Real token-bearing model
434
+ # calls are separate child generations; keep this span out of the
435
+ # generation namespace so trace aggregation does not double-count.
436
+ span.set_attribute("openinference.span.kind", "AGENT")
408
437
  span.set_attribute("ksadk.agent_id", agent_id)
409
438
  span.set_attribute("ksadk.user_id", user_id)
410
439
  span.set_attribute("ksadk.session_id", session_id)
@@ -15,6 +15,8 @@ from ksadk.conversations.runtime_observability import (
15
15
  _responses_usage_payload,
16
16
  _usage_from_metadata,
17
17
  )
18
+ from ksadk.runtime.skill_eval_result import skill_eval_response_fields
19
+ from ksadk.runtime.timing import normalize_timing
18
20
  from ksadk.sessions import SessionEvent
19
21
 
20
22
 
@@ -131,6 +133,8 @@ def build_responses_payload(
131
133
  status: str = "completed",
132
134
  metadata: Mapping[str, Any] | None = None,
133
135
  usage: Mapping[str, Any] | None = None,
136
+ timing: Mapping[str, Any] | None = None,
137
+ skill_eval_result: Mapping[str, Any] | None = None,
134
138
  incomplete_details: Mapping[str, Any] | None = None,
135
139
  error: Mapping[str, Any] | None = None,
136
140
  output_items: Sequence[Mapping[str, Any]] | None = None,
@@ -174,7 +178,11 @@ def build_responses_payload(
174
178
  "tools": [],
175
179
  "output": output,
176
180
  "output_text": output_text,
181
+ **skill_eval_response_fields({"skill_eval_result": skill_eval_result}),
177
182
  "usage": usage_payload,
183
+ **(
184
+ {"timing": normalized_timing} if (normalized_timing := normalize_timing(timing)) else {}
185
+ ),
178
186
  "session_id": session_id,
179
187
  }
180
188
 
@@ -19,7 +19,13 @@ from ksadk.conversations.runtime_constants import (
19
19
  EVENT_SCAN_PAGE_SIZE,
20
20
  )
21
21
  from ksadk.conversations.runtime_observability import _extract_deferred_tool_names
22
+ from ksadk.runtime_context import TRUSTED_IDENTITY_METADATA_KEY, PlatformIdentityContext
22
23
  from ksadk.sessions import Session, SessionEvent, resolve_session_service
24
+ from ksadk.sessions.invocation_identity import (
25
+ bind_or_validate_session_identity,
26
+ identity_native_user_id,
27
+ require_complete_platform_identity,
28
+ )
23
29
 
24
30
 
25
31
  async def ensure_conversation_session(
@@ -28,20 +34,110 @@ async def ensure_conversation_session(
28
34
  user_id: str,
29
35
  session_id: Optional[str],
30
36
  session_service_provider: Callable[[], Any] | None = None,
37
+ invocation_identity: Any = None,
38
+ allow_agent_alias: bool = False,
31
39
  ) -> Session:
32
- """确保会话存在,并在显式 session_id 冲突时做 owner 校验。"""
40
+ """确保会话存在,并在读取历史前校验可信业务 owner。"""
33
41
  service = (session_service_provider or resolve_session_service)()
42
+ identity = require_complete_platform_identity(invocation_identity)
34
43
  if session_id:
35
- existing = await service.get_session(session_id)
44
+ # Ownership is decided from metadata/state before any transcript read.
45
+ existing = await service.get_session_metadata(session_id)
36
46
  if existing:
37
- if existing.agent_id != agent_id or existing.user_id != user_id:
38
- raise HTTPException(
39
- status_code=409,
40
- detail="Session id belongs to a different agent or user",
47
+ if existing.agent_id != agent_id:
48
+ if allow_agent_alias and not identity.is_empty:
49
+ # Hosted workers receive an internal instance alias while
50
+ # the control plane persists the public AgentId. The
51
+ # worker is already scoped to this session store; adopt
52
+ # the persisted owner before validating business identity.
53
+ agent_id = existing.agent_id
54
+ elif not identity.is_empty:
55
+ raise HTTPException(status_code=404, detail="Session not found")
56
+ else:
57
+ raise HTTPException(
58
+ status_code=409,
59
+ detail="Session id belongs to a different agent or user",
60
+ )
61
+ if existing.agent_id == agent_id:
62
+ return await bind_or_validate_session_identity(
63
+ service=service,
64
+ session=existing,
65
+ identity=identity,
66
+ requested_user_id=user_id,
41
67
  )
42
- return existing
43
- return await service.create_session(agent_id, user_id, session_id=session_id)
44
- return await service.create_session(agent_id, user_id)
68
+ native_user_id = identity_native_user_id(identity) or user_id
69
+ created = await service.create_session(agent_id, native_user_id, session_id=session_id)
70
+ if created.agent_id != agent_id:
71
+ raise HTTPException(status_code=404, detail="Session not found")
72
+ return await bind_or_validate_session_identity(
73
+ service=service,
74
+ session=created,
75
+ identity=identity,
76
+ requested_user_id=user_id,
77
+ )
78
+ native_user_id = identity_native_user_id(identity) or user_id
79
+ created = await service.create_session(agent_id, native_user_id)
80
+ return await bind_or_validate_session_identity(
81
+ service=service,
82
+ session=created,
83
+ identity=identity,
84
+ requested_user_id=user_id,
85
+ )
86
+
87
+
88
+ async def require_conversation_session(
89
+ *,
90
+ agent_id: str,
91
+ user_id: str,
92
+ session_id: str,
93
+ session_service_provider: Callable[[], Any] | None = None,
94
+ invocation_identity: Any = None,
95
+ ) -> Session:
96
+ """Authorize an existing session without creating state on a read/control path."""
97
+
98
+ service = (session_service_provider or resolve_session_service)()
99
+ identity = require_complete_platform_identity(invocation_identity)
100
+ existing = await service.get_session_metadata(session_id)
101
+ if existing is None:
102
+ raise HTTPException(status_code=404, detail="Session not found")
103
+ if existing.agent_id != agent_id:
104
+ if not identity.is_empty:
105
+ raise HTTPException(status_code=404, detail="Session not found")
106
+ raise HTTPException(
107
+ status_code=409,
108
+ detail="Session id belongs to a different agent or user",
109
+ )
110
+ return await bind_or_validate_session_identity(
111
+ service=service,
112
+ session=existing,
113
+ identity=identity,
114
+ requested_user_id=user_id,
115
+ )
116
+
117
+
118
+ async def prepare_stream_identity_session(
119
+ *,
120
+ agent_id: str,
121
+ user_id: str,
122
+ session_id: str | None,
123
+ request_metadata: Mapping[str, Any] | None,
124
+ session_service_provider: Callable[[], Any] | None = None,
125
+ ) -> tuple[str, str | None, PlatformIdentityContext, dict[str, Any]]:
126
+ """Authorize a stream before preview reads and hide its private identity carrier."""
127
+
128
+ public_metadata = dict(request_metadata or {})
129
+ identity_payload = public_metadata.pop(TRUSTED_IDENTITY_METADATA_KEY, None)
130
+ identity = PlatformIdentityContext.from_payload(identity_payload)
131
+ if not identity_payload:
132
+ return user_id, session_id, identity, public_metadata
133
+ session = await ensure_conversation_session(
134
+ agent_id=agent_id,
135
+ user_id=user_id,
136
+ session_id=session_id,
137
+ session_service_provider=session_service_provider,
138
+ invocation_identity=identity_payload,
139
+ )
140
+ return session.user_id, session.id, identity, public_metadata
45
141
 
46
142
 
47
143
  async def append_conversation_event(
@@ -73,6 +73,8 @@ from ksadk.conversations.runtime_resume import (
73
73
  )
74
74
  from ksadk.ids import new_run_id
75
75
  from ksadk.model_policy import model_policy_options_for_model
76
+ from ksadk.runtime_context import TRUSTED_IDENTITY_METADATA_KEY, PlatformIdentityContext
77
+ from ksadk.session_context import split_session_context
76
78
  from ksadk.sessions import SessionEvent, resolve_session_service
77
79
 
78
80
  logger = logging.getLogger(__name__)
@@ -122,25 +124,25 @@ async def build_run_input(
122
124
  caller_run_trigger = trigger_from_resume_input(resume_input)
123
125
  provider = session_service_provider or resolve_session_service
124
126
  service = provider()
125
- resolved_user_id = user_id
126
- if session_id:
127
- existing_session = await service.get_session(session_id)
128
- if existing_session and existing_session.user_id:
129
- resolved_user_id = existing_session.user_id
127
+ private_request_metadata = dict(request_metadata or {})
128
+ identity_payload = private_request_metadata.pop(TRUSTED_IDENTITY_METADATA_KEY, None)
129
+ invocation_identity = PlatformIdentityContext.from_payload(identity_payload)
130
130
 
131
131
  session = await ensure_conversation_session(
132
132
  agent_id=agent_id,
133
- user_id=resolved_user_id,
133
+ user_id=user_id,
134
134
  session_id=session_id,
135
135
  session_service_provider=provider,
136
+ invocation_identity=invocation_identity,
136
137
  )
138
+ resolved_user_id = session.user_id
137
139
  resolved_session_id = session.id
138
140
  resolved_invocation_id = str(invocation_id or new_run_id(resolved_session_id))
139
141
  resolved_model_metadata = await _resolve_runtime_model_metadata(
140
142
  model,
141
143
  model_metadata=model_metadata,
142
144
  )
143
- session_context, normalized_request_metadata = split_session_context(request_metadata)
145
+ session_context, normalized_request_metadata = split_session_context(private_request_metadata)
144
146
  normalized_custom_metadata = dict(custom_metadata or {})
145
147
  policy_model = model or os.getenv("OPENAI_MODEL_NAME") or os.getenv("MODEL_NAME")
146
148
  normalized_model_options = {
@@ -205,6 +207,8 @@ async def build_run_input(
205
207
  session_context=session_context.to_payload(),
206
208
  session_id=resolved_session_id,
207
209
  invocation_id=resolved_invocation_id,
210
+ user_id=resolved_user_id,
211
+ agent_id=agent_id,
208
212
  user_input="",
209
213
  user_display_input="",
210
214
  history=history,
@@ -323,6 +327,8 @@ async def build_run_input(
323
327
  session_context=session_context.to_payload(),
324
328
  session_id=resolved_session_id,
325
329
  invocation_id=resolved_invocation_id,
330
+ user_id=resolved_user_id,
331
+ agent_id=agent_id,
326
332
  user_input=resume_text,
327
333
  user_display_input=resume_text,
328
334
  history=history,