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
@@ -6,7 +6,6 @@ LangGraphRunner - LangGraph 框架运行时
6
6
 
7
7
  import asyncio
8
8
  import base64
9
- import inspect
10
9
  import os
11
10
  import re
12
11
  import sqlite3
@@ -17,13 +16,21 @@ from langgraph.types import Command
17
16
 
18
17
  from ksadk.conversations.attachments import classify_attachment_kind, read_attachment_uri_bytes
19
18
  from ksadk.runners._langgraph_runner_streams import _LangGraphStreamMixin
19
+ from ksadk.runners._langgraph_state_reader import (
20
+ interrupt_info_from_state,
21
+ known_subgraph_namespaces,
22
+ read_graph_state,
23
+ )
24
+ from ksadk.runners._session_identity import LangGraphSessionIdentityMixin
20
25
  from ksadk.runners.base_runner import BaseRunner
21
26
  from ksadk.runners.utils import load_agent_module
27
+ from ksadk.runtime.skill_eval_result import skill_eval_response_fields
28
+ from ksadk.runtime.timing import extract_timing
22
29
  from ksadk.sessions import resolve_persistence_topology
23
30
  from ksadk.sessions.continuity import LangGraphSessionAdapter
24
31
 
25
32
 
26
- class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
33
+ class LangGraphRunner(LangGraphSessionIdentityMixin, _LangGraphStreamMixin, BaseRunner):
27
34
  """LangGraph 框架运行时
28
35
 
29
36
  透传原生 LangGraph 功能,支持任意 State 格式
@@ -35,12 +42,14 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
35
42
 
36
43
  def __init__(self, detection_result: Any, project_dir: str):
37
44
  super().__init__(detection_result, project_dir)
45
+ self._module: Any = None
38
46
  self._managed_checkpoint_lock = asyncio.Lock()
39
47
  self._managed_checkpoint_prepared = False
40
48
  self._managed_checkpoint_state = "uninitialized"
41
49
  self._managed_checkpoint_error: tuple[str, str] | None = None
42
50
  self._managed_checkpoint_pool: Any = None
43
- self._managed_checkpoint_namespace = ""
51
+ self._identity_thread_bindings: dict[str, str] = {}
52
+ self._identity_thread_lock = asyncio.Lock()
44
53
 
45
54
  def load_agent(self) -> None:
46
55
  self._load_agent(force_reload=False)
@@ -133,8 +142,7 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
133
142
  return "unknown"
134
143
  try:
135
144
  closed_values = {
136
- name: cell.cell_contents
137
- for name, cell in zip(code.co_freevars, closure)
145
+ name: cell.cell_contents for name, cell in zip(code.co_freevars, closure)
138
146
  }
139
147
  except (AttributeError, ValueError):
140
148
  return "unknown"
@@ -199,8 +207,7 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
199
207
  "ResumeMode": "none",
200
208
  "ReasonCode": "CHECKPOINTER_NOT_DURABLE",
201
209
  "Reason": (
202
- "In-memory checkpoint cannot be recovered after process restart "
203
- "or across pods"
210
+ "In-memory checkpoint cannot be recovered after process restart or across pods"
204
211
  ),
205
212
  }
206
213
  return {
@@ -326,18 +333,6 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
326
333
  "on",
327
334
  }
328
335
 
329
- @staticmethod
330
- def _resolve_checkpoint_namespace() -> str:
331
- session_namespace = str(os.getenv("KSADK_SESSION_NAMESPACE") or "").strip()
332
- if session_namespace:
333
- return session_namespace
334
- agent_id = str(
335
- os.getenv("AGENTENGINE_AGENT_ID")
336
- or os.getenv("KSADK_AGENT_ID")
337
- or "default"
338
- ).strip()
339
- return f"agent:{agent_id}"
340
-
341
336
  async def _create_managed_postgres_saver(self, dsn: str) -> tuple[Any, Any]:
342
337
  from langgraph.checkpoint.postgres.aio import AsyncPostgresSaver
343
338
  from psycopg.rows import dict_row
@@ -390,20 +385,12 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
390
385
  )
391
386
  checkpoint_id = str(
392
387
  native_ref.get("checkpoint_id")
393
- or (
394
- langgraph_ref.get("checkpoint_id")
395
- if isinstance(langgraph_ref, Mapping)
396
- else ""
397
- )
388
+ or (langgraph_ref.get("checkpoint_id") if isinstance(langgraph_ref, Mapping) else "")
398
389
  or ""
399
390
  ).strip()
400
391
  thread_id = str(
401
392
  native_ref.get("thread_id")
402
- or (
403
- langgraph_ref.get("thread_id")
404
- if isinstance(langgraph_ref, Mapping)
405
- else ""
406
- )
393
+ or (langgraph_ref.get("thread_id") if isinstance(langgraph_ref, Mapping) else "")
407
394
  or ""
408
395
  ).strip()
409
396
  if not checkpoint_id or not thread_id:
@@ -424,11 +411,7 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
424
411
  }
425
412
  checkpoint_ns = str(
426
413
  native_ref.get("checkpoint_ns")
427
- or (
428
- langgraph_ref.get("checkpoint_ns")
429
- if isinstance(langgraph_ref, Mapping)
430
- else ""
431
- )
414
+ or (langgraph_ref.get("checkpoint_ns") if isinstance(langgraph_ref, Mapping) else "")
432
415
  or ""
433
416
  ).strip()
434
417
  if checkpoint_ns:
@@ -436,8 +419,7 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
436
419
  config = {"configurable": configurable}
437
420
 
438
421
  if callable(
439
- getattr(self._agent, "aget_state", None)
440
- or getattr(self._agent, "get_state", None)
422
+ getattr(self._agent, "aget_state", None) or getattr(self._agent, "get_state", None)
441
423
  ):
442
424
  return await self._checkpoint_state_resolves(
443
425
  config,
@@ -470,14 +452,9 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
470
452
  ) -> bool:
471
453
  """Confirm one exact persisted checkpoint through the active graph."""
472
454
 
473
- get_state = getattr(self._agent, "aget_state", None) or getattr(
474
- self._agent, "get_state", None
475
- )
476
- if not callable(get_state):
455
+ state, _error = await self._read_graph_state(config)
456
+ if state is None:
477
457
  return False
478
- state = get_state(config)
479
- if inspect.isawaitable(state):
480
- state = await state
481
458
  state_created_at = (
482
459
  state.get("created_at")
483
460
  if isinstance(state, Mapping)
@@ -509,19 +486,13 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
509
486
  async with self._managed_checkpoint_lock:
510
487
  if self._managed_checkpoint_state in {"ready", "terminal_failure"}:
511
488
  return
512
- if (
513
- self._managed_checkpoint_state == "transient_failure"
514
- and not allow_transient_retry
515
- ):
489
+ if self._managed_checkpoint_state == "transient_failure" and not allow_transient_retry:
516
490
  return
517
491
 
518
492
  checkpointer = getattr(self._agent, "checkpointer", None)
519
493
  if checkpointer is None:
520
494
  checkpointer = getattr(self._agent, "_checkpointer", None)
521
495
  if self._checkpoint_backend_from_saver(checkpointer) == "postgres":
522
- self._managed_checkpoint_namespace = (
523
- self._resolve_checkpoint_namespace()
524
- )
525
496
  self._managed_checkpoint_prepared = True
526
497
  self._managed_checkpoint_state = "ready"
527
498
  return
@@ -537,6 +508,13 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
537
508
  self._managed_checkpoint_state = "terminal_failure"
538
509
  return
539
510
 
511
+ # 探测路径可能先于首个 chat 请求 probe(本地调试与手动部署形态的
512
+ # capability adapter 均未 preflight)。此时驻留图还没加载,先完成
513
+ # 模块加载:既避免把"未加载"误判为"无 durable checkpointer",
514
+ # 也避免对未初始化的 _module 抛 AttributeError 被静默吞掉。
515
+ if self._agent is None:
516
+ self.load_agent()
517
+
540
518
  factory = getattr(self._module, "ksadk_graph_factory", None)
541
519
  if not callable(factory):
542
520
  self._managed_checkpoint_error = (
@@ -548,6 +526,23 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
548
526
  self._managed_checkpoint_state = "terminal_failure"
549
527
  return
550
528
 
529
+ # 托管 checkpointer 从 checkpoint 恢复 messages(append-only reducer)。
530
+ # 若接入方未导出 ksadk_prepare_state,runner 走 _to_state 把 history 再注入
531
+ # 一遍,与 checkpointer 恢复的 messages 双重叠加。托管 checkpoint 必须同时
532
+ # 提供 hook,否则 fail-closed,避免生产 auto checkpoint 下静默双重注入。
533
+ prepare_state_hook = getattr(self._module, "ksadk_prepare_state", None)
534
+ if not callable(prepare_state_hook):
535
+ self._managed_checkpoint_error = (
536
+ "PREPARE_STATE_HOOK_REQUIRED",
537
+ "Managed PostgreSQL checkpoint requires ksadk_prepare_state hook to "
538
+ "avoid double history injection (checkpointer messages restore + "
539
+ "_to_state history). Export ksadk_prepare_state(payload, "
540
+ "session_context) in the agent module.",
541
+ )
542
+ self._managed_checkpoint_prepared = True
543
+ self._managed_checkpoint_state = "terminal_failure"
544
+ return
545
+
551
546
  pool = None
552
547
  try:
553
548
  saver, pool = await self._create_managed_postgres_saver(checkpoint_target.dsn)
@@ -556,9 +551,6 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
556
551
  raise TypeError("ksadk_graph_factory must return a compiled LangGraph graph")
557
552
  self._agent = managed_graph
558
553
  self._managed_checkpoint_pool = pool
559
- self._managed_checkpoint_namespace = (
560
- self._resolve_checkpoint_namespace()
561
- )
562
554
  self._managed_checkpoint_error = None
563
555
  self._managed_checkpoint_state = "ready"
564
556
  except (ModuleNotFoundError, ImportError):
@@ -577,8 +569,10 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
577
569
  permission_failure = any(
578
570
  marker in error_name for marker in ("privilege", "permission")
579
571
  )
580
- terminal = authentication_failure or permission_failure or isinstance(
581
- exc, (TypeError, ValueError)
572
+ terminal = (
573
+ authentication_failure
574
+ or permission_failure
575
+ or isinstance(exc, (TypeError, ValueError))
582
576
  )
583
577
  reason_code = (
584
578
  "AUTH_FAILED"
@@ -612,11 +606,14 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
612
606
  await super().close()
613
607
 
614
608
  def _get_config(self, session_id: str) -> dict:
615
- """获取运行配置"""
616
- config: dict[str, Any] = {"configurable": {"thread_id": session_id}}
617
- if self._managed_checkpoint_namespace:
618
- config["configurable"]["checkpoint_ns"] = self._managed_checkpoint_namespace
619
- return config
609
+ """获取运行配置
610
+
611
+ 只写 thread_id:checkpoint_ns 是 LangGraph 的子图寻址字段,不是租户
612
+ 隔离字段。把租户/agent scope 塞进 configurable.checkpoint_ns 会让
613
+ Pregel 的 aget_state 走子图重定向并抛 "Subgraph <scope> not found",
614
+ 静默打掉流式路径的待审批探测。租户隔离由 thread_id 承担。
615
+ """
616
+ return {"configurable": {"thread_id": session_id}}
620
617
 
621
618
  @staticmethod
622
619
  def _extract_langgraph_checkpoint_ref(payload: Dict[str, Any]) -> dict[str, Any]:
@@ -628,19 +625,28 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
628
625
  return {}
629
626
  return dict(langgraph_ref)
630
627
 
631
- @classmethod
628
+ def _known_subgraph_namespaces(self) -> set[str]:
629
+ """当前图里真实存在的子图 namespace 集合(无法探测时返回空集)。"""
630
+ return known_subgraph_namespaces(self._agent)
631
+
632
632
  def _apply_checkpoint_resume_config(
633
- cls,
633
+ self,
634
634
  config: dict[str, Any],
635
635
  *,
636
636
  session_id: str,
637
637
  checkpoint_ref: dict[str, Any],
638
+ enforce_bound_thread: bool = False,
638
639
  ) -> dict[str, Any]:
639
640
  checkpoint_id = str(checkpoint_ref.get("checkpoint_id") or "").strip()
640
641
  if not checkpoint_id:
641
642
  raise ValueError("checkpoint_resume requires framework_ref.langgraph.checkpoint_id")
642
643
 
643
- thread_id = str(checkpoint_ref.get("thread_id") or session_id or "").strip()
644
+ configured = dict(config.get("configurable") or {})
645
+ bound_thread_id = str(configured.get("thread_id") or session_id or "").strip()
646
+ requested_thread_id = str(checkpoint_ref.get("thread_id") or "").strip()
647
+ if enforce_bound_thread and requested_thread_id and requested_thread_id != bound_thread_id:
648
+ raise ValueError("checkpoint_resume thread does not belong to this session")
649
+ thread_id = requested_thread_id or bound_thread_id
644
650
  if not thread_id:
645
651
  raise ValueError(
646
652
  "checkpoint_resume requires session_id or framework_ref.langgraph.thread_id"
@@ -649,7 +655,23 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
649
655
  next_config = dict(config)
650
656
  configurable = dict(next_config.get("configurable") or {})
651
657
  configurable["thread_id"] = thread_id
652
- configurable["checkpoint_ns"] = str(checkpoint_ref.get("checkpoint_ns") or "")
658
+ # checkpoint_ns 只承载 LangGraph 子图寻址语义。真实运行时 namespace 的
659
+ # 格式是 "<子图名>:<task_path>"(如 inner:<task-id>),get_subgraphs()
660
+ # 返回的是裸子图名——所以校验必须只比对首段,合法时保留原始完整
661
+ # namespace(带任务路径;否则 aget_state 定位不到对应 checkpoint)。
662
+ # 不匹配的地址(含历史租户/agent scope 残留)显性报错,绝不静默改写
663
+ # 成根地址——静默改写曾让恢复悄悄指向不存在的 checkpoint。
664
+ requested_namespace = str(checkpoint_ref.get("checkpoint_ns") or "").strip()
665
+ if requested_namespace:
666
+ known = self._known_subgraph_namespaces()
667
+ leading = requested_namespace.split(":", 1)[0]
668
+ if leading not in known:
669
+ raise ValueError(
670
+ "checkpoint_resume checkpoint_ns does not address any subgraph "
671
+ f"of this graph: {requested_namespace!r} "
672
+ f"(known subgraphs: {sorted(known) or 'none'})"
673
+ )
674
+ configurable["checkpoint_ns"] = requested_namespace
653
675
  configurable["checkpoint_id"] = checkpoint_id
654
676
  next_config["configurable"] = configurable
655
677
  return next_config
@@ -754,13 +776,8 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
754
776
  }
755
777
 
756
778
  async def _latest_checkpoint_metadata(self, config: dict[str, Any]) -> dict[str, Any]:
757
- state = None
758
- try:
759
- if callable(getattr(self._agent, "aget_state", None)):
760
- state = await self._agent.aget_state(config)
761
- elif callable(getattr(self._agent, "get_state", None)):
762
- state = self._agent.get_state(config)
763
- except Exception:
779
+ state, _error = await self._read_graph_state(config)
780
+ if state is None:
764
781
  return {}
765
782
  framework_ref = self._checkpoint_ref_from_state(state)
766
783
  if not framework_ref:
@@ -796,13 +813,8 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
796
813
  }
797
814
 
798
815
  async def _latest_state_usage(self, config: dict[str, Any]) -> dict[str, Any]:
799
- state = None
800
- try:
801
- if callable(getattr(self._agent, "aget_state", None)):
802
- state = await self._agent.aget_state(config)
803
- elif callable(getattr(self._agent, "get_state", None)):
804
- state = self._agent.get_state(config)
805
- except Exception:
816
+ state, _error = await self._read_graph_state(config)
817
+ if state is None:
806
818
  return {}
807
819
  values = getattr(state, "values", None)
808
820
  if values is not None:
@@ -1091,10 +1103,15 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
1091
1103
  final_metadata = final_chunk.get("metadata")
1092
1104
  if isinstance(final_metadata, Mapping):
1093
1105
  metadata = {**dict(final_metadata), **metadata}
1094
- result: dict[str, Any] = {"output": output_text, "raw": {"chunks": chunks}}
1106
+ result: dict[str, Any] = {
1107
+ "output": output_text, "raw": {"chunks": chunks},
1108
+ **skill_eval_response_fields(final_chunk),
1109
+ }
1095
1110
  usage = final_chunk.get("usage")
1096
1111
  if isinstance(usage, Mapping) and usage:
1097
1112
  result["usage"] = dict(usage)
1113
+ if timing := extract_timing(final_chunk):
1114
+ result["timing"] = timing
1098
1115
  if metadata:
1099
1116
  result["metadata"] = metadata
1100
1117
  return result
@@ -1126,12 +1143,13 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
1126
1143
  payload.get("platform_context"),
1127
1144
  context_schema=getattr(self._agent, "context_schema", None),
1128
1145
  )
1129
- config = self._get_config(session_id)
1146
+ config = await self._get_session_config(session_id)
1130
1147
  if is_checkpoint_resume:
1131
1148
  config = self._apply_checkpoint_resume_config(
1132
1149
  config,
1133
1150
  session_id=session_id,
1134
1151
  checkpoint_ref=checkpoint_ref,
1152
+ enforce_bound_thread=bool(self._invocation_identity_scope_ref()),
1135
1153
  )
1136
1154
 
1137
1155
  # 判断输入格式 / resume
@@ -1172,7 +1190,12 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
1172
1190
  context=native_context,
1173
1191
  )
1174
1192
 
1175
- output = {"output": self._extract_output(result), "raw": result}
1193
+ output = {
1194
+ "output": self._extract_output(result), "raw": result,
1195
+ **skill_eval_response_fields(result),
1196
+ }
1197
+ if timing := extract_timing(result):
1198
+ output["timing"] = timing
1176
1199
  usage = self._extract_usage(result)
1177
1200
  if usage:
1178
1201
  output["usage"] = usage
@@ -1186,7 +1209,14 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
1186
1209
 
1187
1210
  except Exception as e:
1188
1211
  if "Interrupt" in type(e).__name__:
1189
- interrupt_info = self._get_interrupt_info(self._agent.get_state(config))
1212
+ state, error = await self._read_graph_state(config, include_subgraphs=True)
1213
+ if state is None:
1214
+ # 图已经抛出 interrupt,但状态读不回来:这里必须显性失败,
1215
+ # 不能返回空 interrupt_info,更不能伪装成正常完成。
1216
+ raise RuntimeError(
1217
+ "graph interrupted but its checkpoint state could not be read"
1218
+ ) from error
1219
+ interrupt_info = self._get_interrupt_info(state)
1190
1220
  return {
1191
1221
  "type": "interrupt",
1192
1222
  "interrupt_info": interrupt_info,
@@ -1221,35 +1251,20 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
1221
1251
  return str(content)
1222
1252
  return str(result) if result else ""
1223
1253
 
1254
+ async def _read_graph_state(
1255
+ self,
1256
+ config: Mapping[str, Any],
1257
+ *,
1258
+ include_subgraphs: bool = False,
1259
+ ) -> tuple[Any | None, Exception | None]:
1260
+ """统一的图状态读取入口(实现在 `_langgraph_state_reader`,全仓唯一)。"""
1261
+ return await read_graph_state(
1262
+ self._agent, config, include_subgraphs=include_subgraphs
1263
+ )
1264
+
1224
1265
  def _get_interrupt_info(self, state) -> dict:
1225
- """从 state 中获取 interrupt 信息"""
1226
- if hasattr(state, "tasks") and state.tasks:
1227
- for task in state.tasks:
1228
- if hasattr(task, "interrupts") and task.interrupts:
1229
- for intr in task.interrupts:
1230
- if hasattr(intr, "value"):
1231
- value = intr.value
1232
- info = dict(value) if isinstance(value, Mapping) else {"value": value}
1233
- interrupt_id = str(getattr(intr, "id", "") or "")
1234
- if interrupt_id:
1235
- info.setdefault("approval_request_id", interrupt_id)
1236
- # HumanInTheLoopMiddleware 的 interrupt value 把
1237
- # tool_name/arguments 嵌在 action_requests[0] 里;
1238
- # 下游期望顶层字段,这里提取并保留原 action_requests。
1239
- action_requests = info.get("action_requests")
1240
- if isinstance(action_requests, list) and action_requests:
1241
- first = action_requests[0]
1242
- if isinstance(first, Mapping):
1243
- info.setdefault("tool_name", str(first.get("name") or ""))
1244
- raw_args = first.get("args") or first.get("arguments")
1245
- if raw_args is not None:
1246
- info.setdefault("arguments", raw_args)
1247
- if first.get("description") is not None:
1248
- info.setdefault(
1249
- "description", str(first.get("description"))
1250
- )
1251
- return info
1252
- return {}
1266
+ """从 state 中获取 interrupt 信息(含子图嵌套任务)。"""
1267
+ return interrupt_info_from_state(state)
1253
1268
 
1254
1269
  async def _stream_checkpoint_resume_updates(
1255
1270
  self,
@@ -1293,6 +1308,7 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
1293
1308
  latest_config = self._latest_checkpoint_config(config)
1294
1309
  state_usage = await self._latest_state_usage(latest_config)
1295
1310
  state_output = ""
1311
+ result_fields: dict[str, Any] = {}
1296
1312
  try:
1297
1313
  state = None
1298
1314
  if callable(getattr(self._agent, "aget_state", None)):
@@ -1302,12 +1318,14 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
1302
1318
  values = getattr(state, "values", None)
1303
1319
  if values is not None:
1304
1320
  state_output = self._extract_output(values)
1321
+ result_fields = skill_eval_response_fields(values)
1305
1322
  except Exception:
1306
1323
  state_output = ""
1307
1324
  final_output = state_output or self._extract_output(latest_output)
1308
1325
  yield {
1309
1326
  "type": "final",
1310
1327
  "output": final_output,
1328
+ **result_fields,
1311
1329
  **({"usage": state_usage} if state_usage else {}),
1312
1330
  **({"resume_noop": True} if not emitted_update else {}),
1313
1331
  }
@@ -1386,7 +1404,6 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
1386
1404
  )
1387
1405
  return events
1388
1406
 
1389
-
1390
1407
  def _filter_tool_tags(self, content: str) -> str:
1391
1408
  """过滤 <tool_call> 标签"""
1392
1409
  if not isinstance(content, str):
@@ -26,6 +26,12 @@ logger = logging.getLogger(__name__)
26
26
 
27
27
  # Original function reference (to avoid recursion if patched multiple times)
28
28
  _original_convert_delta = None
29
+ _original_convert_chunk_to_generation_chunk = None
30
+
31
+ # Dedup cache for upstream streams that return identical usage in both the
32
+ # finish chunk and the trailing choices=[] chunk. Keyed by response ID so
33
+ # concurrent streams don't interfere.
34
+ _usage_dedup_cache: dict[str, dict] = {}
29
35
 
30
36
 
31
37
  def _patched_convert_delta_to_message_chunk(
@@ -154,10 +160,43 @@ def _patched_chat_get_request_payload(self, input_, *, stop=None, **kwargs):
154
160
  return _merge_payload_options(payload, model_options_for_chat_completions(model_options))
155
161
 
156
162
 
163
+ def _patched_convert_chunk_to_generation_chunk(
164
+ self,
165
+ chunk: dict,
166
+ default_chunk_class: type,
167
+ base_generation_info: dict | None = None,
168
+ ):
169
+ """Suppress duplicate usage from upstream streams that return identical
170
+ usage in both the finish chunk and the trailing choices=[] chunk.
171
+
172
+ LangChain-core sums usage_metadata across chunks, so two identical usage
173
+ values produce a 2x result in Langfuse. This patch strips the second
174
+ occurrence before LangChain sees it, keyed by response ID.
175
+ """
176
+ token_usage = chunk.get("usage")
177
+ response_id = str(chunk.get("id") or "")
178
+ if token_usage is not None and response_id:
179
+ cached = _usage_dedup_cache.get(response_id)
180
+ if cached is not None and cached == token_usage:
181
+ chunk = dict(chunk)
182
+ chunk.pop("usage", None)
183
+ else:
184
+ _usage_dedup_cache[response_id] = dict(token_usage)
185
+ if len(_usage_dedup_cache) > 1024:
186
+ _usage_dedup_cache.clear()
187
+ choices = chunk.get("choices") or []
188
+ if len(choices) == 0 and response_id:
189
+ _usage_dedup_cache.pop(response_id, None)
190
+ return _original_convert_chunk_to_generation_chunk(
191
+ self, chunk, default_chunk_class, base_generation_info
192
+ )
193
+
194
+
157
195
  def apply_patch():
158
196
  """Apply the monkey patch to langchain_openai."""
159
197
  global _original_convert_delta, _original_convert_message_to_dict
160
198
  global _original_base_get_request_payload, _original_chat_get_request_payload
199
+ global _original_convert_chunk_to_generation_chunk
161
200
  try:
162
201
  import langchain_openai.chat_models.base as base_module
163
202
 
@@ -178,6 +217,14 @@ def apply_patch():
178
217
  _original_chat_get_request_payload = base_module.ChatOpenAI._get_request_payload
179
218
  base_module.ChatOpenAI._get_request_payload = _patched_chat_get_request_payload
180
219
 
220
+ # Patch 3: Deduplicate streaming usage to prevent Langfuse token doubling
221
+ _original_convert_chunk_to_generation_chunk = (
222
+ base_module.BaseChatOpenAI._convert_chunk_to_generation_chunk
223
+ )
224
+ base_module.BaseChatOpenAI._convert_chunk_to_generation_chunk = (
225
+ _patched_convert_chunk_to_generation_chunk
226
+ )
227
+
181
228
  base_module._ksadk_patched = True
182
229
 
183
230
  # logger.info("Applied langchain-openai patch for reasoning_content support")
@@ -1,4 +1,4 @@
1
- """usage 累加工具:逐字段求和(input/output/total + details 子键)。
1
+ """usage 累加工具:逐字段求和(主计数/canonical 明细 + details 子键)。
2
2
 
3
3
  用于 runner 本轮内多次 LLM 调用的 usage 累积。input_tokens 各 provider 均含 cache
4
4
  (Gemini prompt_token_count 含 cached_content_token_count;OpenAI prompt_tokens 含
@@ -11,7 +11,13 @@ from __future__ import annotations
11
11
 
12
12
  from typing import Any
13
13
 
14
- _MAIN_FIELDS = ("input_tokens", "output_tokens", "total_tokens")
14
+ _SCALAR_FIELDS = (
15
+ "input_tokens",
16
+ "output_tokens",
17
+ "total_tokens",
18
+ "cached_tokens",
19
+ "reasoning_tokens",
20
+ )
15
21
  _DETAIL_FIELDS = ("input_token_details", "output_token_details")
16
22
 
17
23
 
@@ -20,7 +26,9 @@ def accumulate_usage(acc: dict[str, Any], delta: dict[str, Any]) -> dict[str, An
20
26
  if not delta:
21
27
  return dict(acc)
22
28
  result = dict(acc)
23
- for key in _MAIN_FIELDS:
29
+ for key in _SCALAR_FIELDS:
30
+ if key not in result and key not in delta:
31
+ continue
24
32
  result[key] = int(result.get(key) or 0) + int(delta.get(key) or 0)
25
33
  for detail_key in _DETAIL_FIELDS:
26
34
  delta_details = delta.get(detail_key)