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
@@ -0,0 +1,150 @@
1
+ """LangGraph Store → MemoryProvider 适配层(长任务方案 §7.6 / P3)。
2
+
3
+ LangGraph ``BaseStore`` 语义映射到 KsADK MemoryProvider Protocol:
4
+
5
+ - namespace = ``(tenant_id, workspace_id, scope, scope_id)``(作用域隔离);
6
+ - key = ``memory_id``;
7
+ - value = MemoryRecord ``to_payload`` 形态的 dict(KsADK 公共协议,
8
+ Store 不感知 Harness 类型)。
9
+
10
+ KsADK ``MemoryRecord`` 和权限语义始终是公共协议;更换 Backend 不改变
11
+ HarnessSpec 与 RuntimeEvent(方案 §10 P3 验收)。
12
+
13
+ Store API 是 async(``aput/aget/asearch/adelete``);本适配器在同步
14
+ Protocol 方法内用 :func:`asyncio.run` 驱动(事件循环已运行时抛明确错误,
15
+ 调用方应改走异步通道或独立线程)。
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import asyncio
21
+ import time
22
+ from dataclasses import asdict
23
+ from typing import Any
24
+
25
+ from ksadk.memory.models import (
26
+ CoreMemoryRequest,
27
+ MemoryCapabilities,
28
+ MemoryDeleteRequest,
29
+ MemoryDeleteResult,
30
+ MemoryRecord,
31
+ MemorySearchRequest,
32
+ MemorySearchResult,
33
+ )
34
+
35
+
36
+ def _run(coro: Any) -> Any:
37
+ try:
38
+ asyncio.get_running_loop()
39
+ except RuntimeError:
40
+ return asyncio.run(coro)
41
+ raise RuntimeError(
42
+ "LangGraphStoreAdapter 的同步方法不能在事件循环内调用"
43
+ "(请在线程/进程边界使用,或经 MemoryCoordinator 异步通道)"
44
+ )
45
+
46
+
47
+ class LangGraphStoreAdapter:
48
+ """把 LangGraph ``BaseStore`` 适配为 MemoryProvider Protocol。"""
49
+
50
+ capabilities_def = MemoryCapabilities(
51
+ semantic_search=True, # Store 按 value 匹配语义(视实现而定)
52
+ keyword_search=False,
53
+ metadata_filter=True,
54
+ versioned_update=False,
55
+ hard_delete=True,
56
+ ttl=False,
57
+ max_record_chars=8192,
58
+ )
59
+
60
+ def __init__(self, store: Any, *, tenant_id: str = "local") -> None:
61
+ self._store = store
62
+ self._tenant_id = tenant_id
63
+
64
+ # ---- namespace 映射 ----
65
+
66
+ def _ns(self, scope: str, scope_id: str) -> tuple[str, ...]:
67
+ return (self._tenant_id, "store", scope, scope_id)
68
+
69
+ # ---- MemoryProvider Protocol ----
70
+
71
+ def capabilities(self) -> MemoryCapabilities:
72
+ return self.capabilities_def
73
+
74
+ async def _aget(self, memory_id: str, ns: tuple[str, ...]) -> MemoryRecord | None:
75
+ item = await self._store.aget(ns, memory_id)
76
+ return MemoryRecord(**item.value) if item else None
77
+
78
+ def get(self, memory_id: str) -> MemoryRecord | None:
79
+ # Store get 需要 namespace;扫描本适配器管理的 scope 前缀不现实,
80
+ # 调用方(Coordinator)经 search 定位。此处按最近一次 search 缓存解析。
81
+ raise NotImplementedError("请经 search(memory_id 过滤) 定位记录")
82
+
83
+ async def search_async(
84
+ self, request: MemorySearchRequest
85
+ ) -> MemorySearchResult:
86
+ start = time.monotonic()
87
+ records: list[MemoryRecord] = []
88
+ for scope, scope_id in request.scopes:
89
+ items = await self._store.asearch(
90
+ self._ns(scope, scope_id), query=request.query or None,
91
+ limit=request.top_k,
92
+ )
93
+ for item in items:
94
+ try:
95
+ records.append(MemoryRecord(**dict(item.value)))
96
+ except TypeError:
97
+ continue
98
+ return MemorySearchResult(
99
+ status="ok",
100
+ records=records[: request.top_k],
101
+ error_code=None,
102
+ provider="langgraph-store",
103
+ latency_ms=int((time.monotonic() - start) * 1000),
104
+ accounting_accuracy="estimated",
105
+ )
106
+
107
+ def search(self, request: MemorySearchRequest) -> MemorySearchResult:
108
+ return _run(self.search_async(request))
109
+
110
+ async def upsert_async(
111
+ self, record: MemoryRecord, *, expected_version: int | None
112
+ ) -> MemoryRecord:
113
+ if expected_version is not None:
114
+ existing = await self._aget(record.memory_id, self._ns(record.scope, record.scope_id))
115
+ if existing is not None and existing.version != expected_version:
116
+ raise RuntimeError(
117
+ f"version_conflict:expected={expected_version},"
118
+ f"actual={existing.version}"
119
+ )
120
+ payload = asdict(record)
121
+ payload["source_artifact_refs"] = list(record.source_artifact_refs)
122
+ payload["source_artifacts"] = [asdict(item) for item in record.source_artifacts]
123
+ payload["supersedes"] = list(record.supersedes)
124
+ await self._store.aput(self._ns(record.scope, record.scope_id), record.memory_id, payload)
125
+ return record
126
+
127
+ def upsert(self, record: MemoryRecord, *, expected_version: int | None) -> MemoryRecord:
128
+ return _run(self.upsert_async(record, expected_version=expected_version))
129
+
130
+ async def delete_async(self, request: MemoryDeleteRequest) -> MemoryDeleteResult:
131
+ ns = self._ns(request.scope, request.scope_id)
132
+ existing = await self._aget(request.memory_id, ns)
133
+ if existing is None:
134
+ return MemoryDeleteResult(status="ok", deleted=False, error_code="not_found")
135
+ if request.hard:
136
+ await self._store.adelete(ns, request.memory_id)
137
+ else:
138
+ deleted = {**asdict(existing), "status": "deleted"}
139
+ await self._store.aput(ns, request.memory_id, deleted)
140
+ return MemoryDeleteResult(status="ok", deleted=True, error_code=None)
141
+
142
+ def delete(self, request: MemoryDeleteRequest) -> MemoryDeleteResult:
143
+ return _run(self.delete_async(request))
144
+
145
+ def list_core(self, request: CoreMemoryRequest) -> list[MemoryRecord]:
146
+ # Store 无常驻 Block 概念;Core Memory 交由 Coordinator 预算层。
147
+ return []
148
+
149
+
150
+ __all__ = ["LangGraphStoreAdapter"]
ksadk/model_policy.py CHANGED
@@ -7,8 +7,8 @@ from typing import Any, Mapping
7
7
 
8
8
  from ksadk.configs.settings import DEFAULT_MODEL_NAME
9
9
 
10
- DEFAULT_MULTIMODAL_MODEL = "kimi-k2.7-code"
11
- DEFAULT_FALLBACK_MODEL = "deepseek-v4-pro"
10
+ DEFAULT_MULTIMODAL_MODEL = "deepseek-v4.1-flash"
11
+ DEFAULT_FALLBACK_MODEL = "glm-5.3-flash"
12
12
 
13
13
  DEFAULT_MODEL_POLICY: dict[str, Any] = {
14
14
  "version": "v1",
@@ -44,6 +44,16 @@ class ModelCapabilities:
44
44
  preferred_protocol: str = "chat" # "responses" | "chat":路由该走哪条
45
45
  checked_at: float = 0.0
46
46
  verdict: Verdict = "unknown" # 最近一次探测结论
47
+ # --- 以下为 opt-in 贵探测,默认 None(未探),由 probe_extended_capability 按需填充 ---
48
+ # store/previous_response_id 服务端会话链是否真生效(2026-09 实测 deepseek 系
49
+ # 返回 200 但静默丢历史=假支持)。False 时客户端必须每次带全量历史。
50
+ store_supported: bool | None = None
51
+ # 该模型 reasoning_effort 的合法值集合(2026-09 实测 glm-5.3-flash 只认
52
+ # low/high/max,medium/none/xhigh 全 400;且不能按 family 前缀推断,逐模型实测)。
53
+ reasoning_effort_values: frozenset[str] | None = None
54
+ # 非流式响应里 reasoning item 是否稳定出现(2026-09 实测 glm-5.3-flash
55
+ # 同 effort 下约半数响应只有 message 没有 reasoning item;流式不受影响)。
56
+ reasoning_item_reliable: bool | None = None
47
57
 
48
58
 
49
59
  def _classify_responses_error(status: int, body: str) -> Verdict:
@@ -336,3 +346,247 @@ def _finalize(caps: ModelCapabilities) -> ModelCapabilities:
336
346
  # 因为转换层对 chat 模型是确定可用的,而直连 responses 在 unknown 下有风险
337
347
  caps.preferred_protocol = "chat"
338
348
  return caps
349
+
350
+
351
+ # ---------------------------------------------------------------------------
352
+ # Opt-in 贵探测:store 会话链 / reasoning_effort 值域 / reasoning item 可靠性
353
+ # 这三个探测各需多次真实请求,默认不并入 probe_responses_capability,由调用方按需触发。
354
+ # 全部遵循同一铁律:只在确凿证据下置 True/False,故障/超时/不确定一律留 None(未探)。
355
+ # ---------------------------------------------------------------------------
356
+
357
+ # reasoning_effort 候选值,覆盖 OpenAI/Codex 主流档 + glm 的 max。
358
+ _EFFORT_CANDIDATES = ("none", "minimal", "low", "medium", "high", "xhigh", "max")
359
+
360
+
361
+ def probe_extended_capability(
362
+ client: httpx.Client | httpx.AsyncClient,
363
+ base: str,
364
+ key: str,
365
+ model: str,
366
+ timeout: float = 60.0,
367
+ ):
368
+ """按需探测 store/reasoning 三项能力,返回填充了对应字段的 ModelCapabilities。
369
+
370
+ - ``store_supported``: store=true 拿 response_id,再用 previous_response_id
371
+ 追问一个只有上一轮才知道的事实;答出=真支持,答不出=假支持(静默丢历史)。
372
+ - ``reasoning_effort_values``: 逐个候选值发最小请求,200=接受,400=拒绝;
373
+ 其余(超时/5xx)不计入(故障≠值域缺失)。
374
+ - ``reasoning_item_reliable``: 非流式带 reasoning 请求,检查 output 是否含
375
+ reasoning item。单次缺席不足以判 False(可能模型本来没想),需 N 次全缺席才判。
376
+
377
+ 按 client 类型分发:sync 返回 ModelCapabilities,async 返回 coroutine。
378
+ """
379
+ if isinstance(client, httpx.AsyncClient):
380
+ return _probe_extended_async(client, base, key, model, timeout)
381
+ if isinstance(client, httpx.Client):
382
+ return _probe_extended_sync(client, base, key, model, timeout)
383
+ raise TypeError(f"client 必须是 httpx.Client/AsyncClient,不是 {type(client).__name__}")
384
+
385
+
386
+ def _reasoning_item_present(data: Any) -> bool:
387
+ if not isinstance(data, dict):
388
+ return False
389
+ return any(
390
+ isinstance(item, dict) and item.get("type") == "reasoning"
391
+ for item in data.get("output", [])
392
+ )
393
+
394
+
395
+ def _post_json(client, url, payload, headers, timeout):
396
+ """统一 sync post + json 解析;返回 (status, data) 或 None(故障)。"""
397
+ try:
398
+ r = client.post(url, json=payload, headers=headers, timeout=timeout)
399
+ except (httpx.TimeoutException, httpx.ConnectError, httpx.HTTPError):
400
+ return None
401
+ try:
402
+ return r.status_code, r.json()
403
+ except ValueError:
404
+ return r.status_code, None
405
+
406
+
407
+ async def _post_json_async(client, url, payload, headers, timeout):
408
+ try:
409
+ r = await client.post(url, json=payload, headers=headers, timeout=timeout)
410
+ except (httpx.TimeoutException, httpx.ConnectError, httpx.HTTPError):
411
+ return None
412
+ try:
413
+ return r.status_code, r.json()
414
+ except ValueError:
415
+ return r.status_code, None
416
+
417
+
418
+ def _store_first_payload(model: str, marker: str) -> dict:
419
+ return {
420
+ "model": model,
421
+ "input": f"记住代号 {marker},只回 OK",
422
+ "max_output_tokens": 200,
423
+ "store": True,
424
+ }
425
+
426
+
427
+ def _probe_store_sync(client, url, headers, model, timeout):
428
+ marker = "cobalt-9173"
429
+ first = _post_json(client, url, _store_first_payload(model, marker), headers, timeout)
430
+ if not first or first[0] != 200 or not isinstance(first[1], dict):
431
+ return None
432
+ rid = first[1].get("id")
433
+ if not rid:
434
+ return None
435
+ second = _post_json(
436
+ client,
437
+ url,
438
+ {"model": model, "input": "我刚才让你记的代号是什么?只回答代号",
439
+ "max_output_tokens": 200, "previous_response_id": rid},
440
+ headers,
441
+ timeout,
442
+ )
443
+ if not second or second[0] != 200 or not isinstance(second[1], dict):
444
+ return None
445
+ text = "".join(
446
+ c.get("text", "")
447
+ for item in second[1].get("output", [])
448
+ if isinstance(item, dict) and item.get("type") == "message"
449
+ for c in item.get("content", [])
450
+ if isinstance(c, dict)
451
+ )
452
+ return marker in text
453
+
454
+
455
+ async def _probe_store_async(client, url, headers, model, timeout):
456
+ marker = "cobalt-9173"
457
+ first = await _post_json_async(
458
+ client, url, _store_first_payload(model, marker), headers, timeout
459
+ )
460
+ if not first or first[0] != 200 or not isinstance(first[1], dict):
461
+ return None
462
+ rid = first[1].get("id")
463
+ if not rid:
464
+ return None
465
+ second = await _post_json_async(
466
+ client,
467
+ url,
468
+ {"model": model, "input": "我刚才让你记的代号是什么?只回答代号",
469
+ "max_output_tokens": 200, "previous_response_id": rid},
470
+ headers,
471
+ timeout,
472
+ )
473
+ if not second or second[0] != 200 or not isinstance(second[1], dict):
474
+ return None
475
+ text = "".join(
476
+ c.get("text", "")
477
+ for item in second[1].get("output", [])
478
+ if isinstance(item, dict) and item.get("type") == "message"
479
+ for c in item.get("content", [])
480
+ if isinstance(c, dict)
481
+ )
482
+ return marker in text
483
+
484
+
485
+ def _probe_effort_values_sync(client, url, headers, model, timeout):
486
+ accepted = set()
487
+ saw_any = False
488
+ for eff in _EFFORT_CANDIDATES:
489
+ res = _post_json(
490
+ client,
491
+ url,
492
+ {"model": model, "input": "hi", "max_output_tokens": 30,
493
+ "reasoning": {"effort": eff}},
494
+ headers,
495
+ timeout,
496
+ )
497
+ if res is None:
498
+ continue # 故障,不计入
499
+ status, _ = res
500
+ saw_any = True
501
+ if status == 200:
502
+ accepted.add(eff)
503
+ # 400 = 明确拒绝该值,不计入 accepted
504
+ return frozenset(accepted) if saw_any else None
505
+
506
+
507
+ async def _probe_effort_values_async(client, url, headers, model, timeout):
508
+ accepted = set()
509
+ saw_any = False
510
+ for eff in _EFFORT_CANDIDATES:
511
+ res = await _post_json_async(
512
+ client,
513
+ url,
514
+ {"model": model, "input": "hi", "max_output_tokens": 30,
515
+ "reasoning": {"effort": eff}},
516
+ headers,
517
+ timeout,
518
+ )
519
+ if res is None:
520
+ continue
521
+ status, _ = res
522
+ saw_any = True
523
+ if status == 200:
524
+ accepted.add(eff)
525
+ return frozenset(accepted) if saw_any else None
526
+
527
+
528
+ def _probe_reasoning_reliable_sync(client, url, headers, model, timeout, trials=3):
529
+ """N 次非流式全缺席 reasoning item 才判 False;任一故障或出现就留 None/True。"""
530
+ absences = 0
531
+ for _ in range(trials):
532
+ res = _post_json(
533
+ client,
534
+ url,
535
+ {"model": model, "input": "9.11 和 9.9 哪个大?", "max_output_tokens": 600,
536
+ "reasoning": {"effort": "low"}},
537
+ headers,
538
+ timeout,
539
+ )
540
+ if res is None or res[0] != 200:
541
+ return None # 故障,无法判定
542
+ if _reasoning_item_present(res[1]):
543
+ return True
544
+ absences += 1
545
+ return False if absences == trials else None
546
+
547
+
548
+ async def _probe_reasoning_reliable_async(client, url, headers, model, timeout, trials=3):
549
+ absences = 0
550
+ for _ in range(trials):
551
+ res = await _post_json_async(
552
+ client,
553
+ url,
554
+ {"model": model, "input": "9.11 和 9.9 哪个大?", "max_output_tokens": 600,
555
+ "reasoning": {"effort": "low"}},
556
+ headers,
557
+ timeout,
558
+ )
559
+ if res is None or res[0] != 200:
560
+ return None
561
+ if _reasoning_item_present(res[1]):
562
+ return True
563
+ absences += 1
564
+ return False if absences == trials else None
565
+
566
+
567
+ def _probe_extended_sync(client, base, key, model, timeout) -> ModelCapabilities:
568
+ caps = ModelCapabilities(checked_at=time.time(), verdict="unknown")
569
+ url = f"{base.rstrip('/')}/responses"
570
+ headers = {"Authorization": f"Bearer {key}", "Content-Type": "application/json"}
571
+ caps.store_supported = _probe_store_sync(client, url, headers, model, timeout)
572
+ caps.reasoning_effort_values = _probe_effort_values_sync(
573
+ client, url, headers, model, timeout
574
+ )
575
+ caps.reasoning_item_reliable = _probe_reasoning_reliable_sync(
576
+ client, url, headers, model, timeout
577
+ )
578
+ return caps
579
+
580
+
581
+ async def _probe_extended_async(client, base, key, model, timeout) -> ModelCapabilities:
582
+ caps = ModelCapabilities(checked_at=time.time(), verdict="unknown")
583
+ url = f"{base.rstrip('/')}/responses"
584
+ headers = {"Authorization": f"Bearer {key}", "Content-Type": "application/json"}
585
+ caps.store_supported = await _probe_store_async(client, url, headers, model, timeout)
586
+ caps.reasoning_effort_values = await _probe_effort_values_async(
587
+ client, url, headers, model, timeout
588
+ )
589
+ caps.reasoning_item_reliable = await _probe_reasoning_reliable_async(
590
+ client, url, headers, model, timeout
591
+ )
592
+ return caps
@@ -248,9 +248,10 @@ def create_app(config: ProxyConfig) -> FastAPI:
248
248
  async def _chat_passthrough_stream(config: ProxyConfig, base: str, headers: dict, body: dict):
249
249
  """chat SSE 字节级透传(不转换),让前缀缓存/流式格式与直连一致。"""
250
250
  try:
251
+ stream_headers = {**headers, "Accept": "text/event-stream"}
251
252
  async with httpx.AsyncClient(timeout=config.timeout) as c:
252
253
  async with c.stream(
253
- "POST", f"{base}/chat/completions", json=body, headers=headers
254
+ "POST", f"{base}/chat/completions", json=body, headers=stream_headers
254
255
  ) as r:
255
256
  async for line in r.aiter_lines():
256
257
  yield line + "\n"
@@ -275,10 +276,11 @@ async def _stream_gen(
275
276
  for e in s.start():
276
277
  yield e
277
278
  try:
279
+ stream_headers = {**headers, "Accept": "text/event-stream"}
278
280
  # 超时必须有界(config.timeout):无限超时的活动 SSE 会让 stop() 后线程仍存活
279
281
  async with httpx.AsyncClient(timeout=config.timeout) as c:
280
282
  async with c.stream(
281
- "POST", f"{base}/chat/completions", json=chat_req, headers=headers
283
+ "POST", f"{base}/chat/completions", json=chat_req, headers=stream_headers
282
284
  ) as r:
283
285
  config.emit(
284
286
  "proxy.upstream",
@@ -234,13 +234,51 @@ _EFFORT_CAP_PREFIXES = (
234
234
  ("qwen3.5", "high"),
235
235
  )
236
236
 
237
+ # 各上游模型的 reasoning_effort 合法值集合(2026-09 实测,见 tests/model_proxy)。
238
+ # 与 _EFFORT_CAP_PREFIXES 的区别:cap 是"单调钳顶"(qwen 超 cap 钳到 cap);
239
+ # 这里是"值域裁剪"——glm-5.3-flash 是始终思考模型,合法值只有 low/high/max,
240
+ # none/minimal/medium/xhigh 全部 400,无法用单调钳顶表达。
241
+ _EFFORT_ALLOWED_SETS = {
242
+ "glm-5.3-flash": ("low", "high", "max"),
243
+ }
244
+ # 值域裁剪用的档位表:max 视为与 xhigh 同级(5),仅在值域裁剪内部使用,
245
+ # 不改 _EFFORT_RANK(影响 cap 路径)。
246
+ _ALLOWED_RANK = {**_EFFORT_RANK, "max": 5}
247
+
248
+
249
+ def remap_reasoning_effort(model, effort):
250
+ """把 reasoning_effort 向上取整到该模型的合法值集合(值域裁剪)。
251
+
252
+ 规则:档位 >= 入参的最近合法档;无更高档则取集合最高档;未知档位取集合最低档。
253
+ 未列出的模型/非字符串原样返回(不做发明式映射)。
254
+
255
+ 实测:glm-5.3-flash 始终思考,medium/xhigh/none/minimal 全 400,
256
+ medium→high、xhigh→max、none/minimal→low。
257
+ """
258
+ if not isinstance(model, str) or not isinstance(effort, str):
259
+ return effort
260
+ allowed = None
261
+ for prefix, vals in _EFFORT_ALLOWED_SETS.items():
262
+ if model.startswith(prefix):
263
+ allowed = vals
264
+ break
265
+ if not allowed or effort in allowed:
266
+ return effort
267
+ r = _ALLOWED_RANK.get(effort)
268
+ if r is None:
269
+ return allowed[0]
270
+ higher = [v for v in allowed if _ALLOWED_RANK[v] >= r]
271
+ return higher[0] if higher else allowed[-1]
272
+
237
273
 
238
274
  def clamp_reasoning_effort(model, effort):
239
- """把超出上游模型族支持上限的 reasoning_effort 钳到最高合法档。
275
+ """把 reasoning_effort 适配到上游模型:先做值域裁剪,再做上限钳制。
240
276
 
241
- codex 对自家模型默认发 xhigh;qwen3.7 系上游 400,需钳到 high。
277
+ 值域裁剪(remap_reasoning_effort)处理非单调值域(如 glm-5.3-flash 只认
278
+ low/high/max);上限钳制处理单调超 cap(如 qwen3.7 xhigh→high)。
242
279
  未知档位/未知模型族原样返回(不做发明式映射)。
243
280
  """
281
+ effort = remap_reasoning_effort(model, effort)
244
282
  if not isinstance(effort, str) or effort not in _EFFORT_RANK:
245
283
  return effort
246
284
  for prefix, cap in _EFFORT_CAP_PREFIXES:
ksadk/plugins/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- """Versioned contracts for the Phase 2 plugin composition boundary.
1
+ """Versioned contracts for the Release plugin composition boundary.
2
2
 
3
3
  This package models discovery, deterministic locking, and the controlled
4
4
  PluginHost lifecycle. It does not create a second runtime/event store;
@@ -998,6 +998,17 @@ class DshProfilePluginBridge:
998
998
  def _prepare_source(self, source: str) -> _PreparedSource:
999
999
  value = source.strip()
1000
1000
  candidate = Path(value).expanduser()
1001
+ if not candidate.is_absolute():
1002
+ # dsh CLI 以 Profile 目录为 cwd 解析 add 的源参数;相对当前工作目录
1003
+ # 存在的本地源必须先绝对化,否则会被写成指向不存在位置的 link: 依赖。
1004
+ workspace_relative = self._cwd / candidate
1005
+ if workspace_relative.exists():
1006
+ candidate = workspace_relative
1007
+ elif value.endswith(".tgz"):
1008
+ raise DshPluginMutationError(
1009
+ f"local DSH plugin source does not exist: {value} "
1010
+ f"(resolved against {self._cwd})"
1011
+ )
1001
1012
  if not candidate.is_absolute() or not candidate.exists():
1002
1013
  return _PreparedSource(value, "", "tgz", "")
1003
1014
  local = candidate.resolve()
ksadk/plugins/builtins.py CHANGED
@@ -36,6 +36,7 @@ SQLITE_SESSION_STORE_PLUGIN_ID = "io.ksadk.session-store.sqlite"
36
36
  WORKSPACE_MCP_PLUGIN_ID = "io.ksadk.mcp.workspace"
37
37
  WORKSPACE_SKILL_PLUGIN_ID = "io.ksadk.skill.workspace"
38
38
  READ_ONLY_CONTEXT_PLUGIN_ID = "io.ksadk.context.bundle-readonly"
39
+ LOCAL_MEMORY_PROVIDER_PLUGIN_ID = "io.ksadk.memory.local-default"
39
40
  CORE_RENDERER_PLUGIN_ID = "io.ksadk.renderer.conversation-core"
40
41
 
41
42
  SecretResolver = Callable[[str], str | None]
@@ -86,7 +87,7 @@ def _manifest(
86
87
 
87
88
 
88
89
  def builtin_capability_manifests() -> tuple[PluginManifest, ...]:
89
- """Return the exact, deterministic Phase 2 built-in capability catalog."""
90
+ """Return the exact, deterministic Release built-in capability catalog."""
90
91
 
91
92
  return (
92
93
  _manifest(
@@ -118,6 +119,12 @@ def builtin_capability_manifests() -> tuple[PluginManifest, ...]:
118
119
  mode="multiple",
119
120
  permissions=("filesystem:bundle-read",),
120
121
  ),
122
+ _manifest(
123
+ LOCAL_MEMORY_PROVIDER_PLUGIN_ID,
124
+ definition="memory.provider/v1",
125
+ slot="memory.primary",
126
+ mode="unique",
127
+ ),
121
128
  _manifest(
122
129
  CORE_RENDERER_PLUGIN_ID,
123
130
  definition="session.item.renderer/v1",
@@ -275,6 +282,27 @@ class WorkspaceMCPRuntime(_BuiltinRuntime):
275
282
  resolved, "endpointUrl", code="builtin_mcp_endpoint_missing"
276
283
  )
277
284
  secret_ref = _optional_string(materializer.get("apiKeyRef"))
285
+ if secret_ref is None:
286
+ # 组合器只透传 binding.config;目录资源的凭据声明在合同
287
+ # envRefs 里(例如 Authorization: env://<API_KEY>)。
288
+ # materializer 未显式覆盖时回退读取资源自身 envRefs,
289
+ # 否则 http MCP 少鉴权头必然 401 transport_failed。
290
+ env_refs = resolved.get("envRefs")
291
+ if isinstance(env_refs, Mapping) and env_refs:
292
+ if len(env_refs) > 1:
293
+ raise PluginHostError(
294
+ "builtin_mcp_credentials_unsupported",
295
+ f"workspace MCP {resolved['name']!r} accepts at most "
296
+ "one Authorization credential",
297
+ )
298
+ header_name, reference = next(iter(env_refs.items()))
299
+ if str(header_name).strip().casefold() != "authorization":
300
+ raise PluginHostError(
301
+ "builtin_mcp_credentials_unsupported",
302
+ f"workspace MCP {resolved['name']!r} envRefs header "
303
+ f"{header_name!r} is not supported; use Authorization",
304
+ )
305
+ secret_ref = str(reference).strip()
278
306
  api_key: str | None = None
279
307
  if secret_ref is not None:
280
308
  if not _is_secret_reference(secret_ref):
@@ -356,7 +384,13 @@ class WorkspaceSkillRuntime(_BuiltinRuntime):
356
384
  instructions = _required_string(
357
385
  item, "instructions", code="builtin_skill_instructions_missing"
358
386
  )
359
- contributions.append(HarnessSkillContribution(name=name, instructions=instructions))
387
+ contributions.append(
388
+ HarnessSkillContribution(
389
+ name=name,
390
+ instructions=instructions,
391
+ resource_root=directory,
392
+ )
393
+ )
360
394
  if not contributions:
361
395
  raise PluginHostError(
362
396
  "builtin_skill_resource_missing", "workspace Skill has no locked resource"
@@ -537,6 +571,9 @@ def builtin_capability_factories(
537
571
  READ_ONLY_CONTEXT_PLUGIN_ID: _SimpleFactory(
538
572
  READ_ONLY_CONTEXT_PLUGIN_ID, ReadOnlyBundleContextRuntime
539
573
  ),
574
+ LOCAL_MEMORY_PROVIDER_PLUGIN_ID: _SimpleFactory(
575
+ LOCAL_MEMORY_PROVIDER_PLUGIN_ID, _BuiltinRuntime
576
+ ),
540
577
  CORE_RENDERER_PLUGIN_ID: _SimpleFactory(
541
578
  CORE_RENDERER_PLUGIN_ID, CoreConversationRendererRuntime
542
579
  ),
@@ -730,6 +767,7 @@ def _is_secret_reference(value: str) -> bool:
730
767
  __all__ = [
731
768
  "BUILTIN_PLUGIN_VERSION",
732
769
  "CORE_RENDERER_PLUGIN_ID",
770
+ "LOCAL_MEMORY_PROVIDER_PLUGIN_ID",
733
771
  "READ_ONLY_CONTEXT_PLUGIN_ID",
734
772
  "SQLITE_SESSION_STORE_PLUGIN_ID",
735
773
  "WORKSPACE_MCP_PLUGIN_ID",